2009-09-17 8 views
38

Typowy scenariusz: klasa, nad którą pracowało wiele osób. Chciałbym posortować metody, właściwości itp. W porządku alfabetycznym.Jak zmienić kolejność członków przy pomocy Resharper?

Chciałbym móc to zrobić w regionie lub na całym świecie w klasie.

Widzę funkcję w Resharper, aby to zrobić, ale wydaje się, że nic nie robi.

+0

Dzięki, wszystkie. Skończyło się na instalacji kopii MZ Tools, którą już posiadam, ale nie używam od 2006 roku. Ma funkcję i działała dobrze. – AngryHacker

+0

To samo przydarzyło mi się. To działało świetnie, a potem przestało. –

Odpowiedz

77

Użyj funkcji "Kod czyszczenia".

Kolejność członków można ustawić w opcjach ReSharper w Języki, C#, Układ członków typu. Jest to dobrze udokumentowana specyfikacja układu XML, którą ReSharper wykorzystuje podczas zmiany kolejności członków.

+28

To tak naprawdę nie działa. – Kyle

+8

@ Kyle, jeśli powiesz R #, aby zmienić kolejność członków, a specyfikacja układu jest poprawna, to rzeczywiście działa. Zobacz dokument R # dla szczegółów; niektóre typy (takie jak klasy testów jednostkowych i struktury interop z sekwencyjnymi atrybutami układu) nie są ponownie przywiązywane, ponieważ kolejność może być znacząca. – Lucero

+1

Nie widzę niczego na temat sortowania alfabetycznego w specyfikacji R #. – manu08

4

Alternatywą do rozważenia jest Regionerate. Używamy i lubimy ReSharper, ale Regionerate odpowiada naszym potrzebom w zakresie tworzenia regionów i sortowania/reorganizacji członków. Oczywiście wszystko można dostosować do własnych potrzeb.

AKTUALIZACJA: Zamiast tego zaczęliśmy używać ReSharper's Code Cleanup.

+0

używaliśmy go przez około 2 tygodnie, ale wtedy, gdy proliferacja zagnieżdżonych regionów zaatakowała nasz kod, wszyscy go wyrzucili. Oczywiście jest to kwestia osobistego gustu, ale upewnij się, że wszyscy zgadzają się, w jaki sposób ma być używany ... – zzzuperfly

+0

@zzzuperfly: Tak, każdy musi zgodzić się ze standardami i musisz poprawić konfigurację. – TrueWill

+3

jeśli używasz regionów to zwykle znak, że twoje zajęcia są zbyt duże, duże = klasy oznaczają, że masz zbyt wiele obowiązków w klasie – roundcrisis

3

Dwie rzeczy: Istnieje znany (ale nie mocno udokumentowany) warunek, w którym warunki wstępne kompilacji (np. If DEBUG na przykład) przerywają zmianę kolejności elementów. http://youtrack.jetbrains.com/issue/RSRP-336643#tab=Comments Innymi słowy, jeśli masz #IF DEBUG, to nie zmieni to kolejności.

Niedawno zauważyłem również, że w ReSharper 8.0.1 (i prawdopodobnie wcześniejszych wersjach) przycisk przywracający szablon XML do DEFAULT WITH REGIONS nie zawiera żadnych instrukcji dołączających do grupy #REGION. Wziąłem więc szablon przyjazny dla StyleCop, który zawiera sortowanie i dodał # REGION-do każdego członka typu. Jeśli wybierzesz NIESTANDARDOWY SZABLON, a następnie wkleisz ten plik XML, powinien on działać.

<Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns"> 

<!-- Do not reorder COM interfaces --> 
<Pattern> 
    <Match> 
     <And Weight="100"> 
      <Kind Is="interface" /> 
      <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute" /> 
     </And> 
    </Match> 
</Pattern> 

<!-- Special formatting of NUnit test fixture --> 
<Pattern RemoveAllRegions="true"> 
    <Match> 
     <And Weight="100"> 
      <Kind Is="class" /> 
      <HasAttribute CLRName="NUnit.Framework.TestFixtureAttribute" Inherit="true" /> 
     </And> 
    </Match> 

    <!-- Setup/Teardow --> 
    <Entry> 
     <Match> 
      <And> 
       <Kind Is="method" /> 
       <Or> 
        <HasAttribute CLRName="NUnit.Framework.SetUpAttribute" Inherit="true" /> 
        <HasAttribute CLRName="NUnit.Framework.TearDownAttribute" Inherit="true" /> 
        <HasAttribute CLRName="NUnit.Framework.FixtureSetUpAttribute" Inherit="true" /> 
        <HasAttribute CLRName="NUnit.Framework.FixtureTearDownAttribute" Inherit="true" /> 
       </Or> 
      </And> 
     </Match> 
    </Entry> 
    <!-- All other members --> 
    <Entry /> 
    <!-- Test methods --> 
    <Entry> 
     <Match> 
      <And Weight="100"> 
       <Kind Is="method" /> 
       <HasAttribute CLRName="NUnit.Framework.TestAttribute" Inherit="false" /> 
      </And> 
     </Match> 
     <Sort> 
      <Name /> 
     </Sort> 
    </Entry> 
</Pattern> 

<!-- Default pattern --> 


<Pattern RemoveAllRegions="false"> 
    <!-- Delegates --> 
    <Entry> 
     <Match> 
      <And Weight="100"> 
       <Access Is="public" /> 
       <Kind Is="delegate" /> 
      </And> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Name /> 
     </Sort> 
     <Group Region="Delegates" /> 
    </Entry> 


    <!-- Fields and constants --> 
    <Entry> 
     <Match> 
      <Or> 
       <Kind Is="field" /> 
       <Kind Is="constant" /> 
      </Or> 
     </Match> 

     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Kind Order="constant" /> 
      <Readonly /> 
      <Static /> 
      <Name /> 
     </Sort> 
     <Group Region="Fields" /> 
    </Entry> 

    <!-- Enums --> 
    <Entry> 
     <Match> 
      <Kind Is="enum" /> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Name /> 
     </Sort> 
     <Group Region="Enums" /> 
    </Entry> 

    <!-- Constructors. Place static one first --> 
    <Entry> 
     <Match> 
      <Kind Is="constructor" /> 
     </Match> 
     <Sort> 
      <Static /> 
      <Access Order="public internal protected-internal protected private" /> 
     </Sort> 
     <Group Region="Constructors" /> 
    </Entry> 

    <!-- Destructors. Place static one first --> 
    <Entry> 
     <Match> 
      <Kind Is="destructor" /> 
     </Match> 
     <Sort> 
      <Static /> 
      <Access Order="public internal protected-internal protected private" /> 
     </Sort> 
     <Group Region="Destructors" /> 
    </Entry> 


    <!-- Events --> 
    <Entry> 
     <Match> 
      <Kind Is="event" /> 
     </Match> 

     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Name /> 
     </Sort> 
     <Group Region="Events" /> 
    </Entry> 

    <!-- Properties --> 
    <Entry> 
     <Match> 
      <And> 
       <Kind Is="property" /> 
       <Not> 
        <Kind Is="indexer" /> 
       </Not> 
      </And> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Static /> 
      <Abstract /> 
      <Virtual /> 
      <Override /> 
      <Name /> 
     </Sort> 
     <Group Region="Properties" /> 
    </Entry> 

    <!-- Indexers --> 
    <Entry> 
     <Match> 
      <Kind Is="indexer" /> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Static /> 
      <Abstract /> 
      <Virtual /> 
      <Override /> 
      <Name /> 
     </Sort> 
     <Group Region="Indexers" /> 
    </Entry> 

    <!-- Methods --> 
    <Entry> 
     <Match> 
      <And> 
       <Or> 
        <Kind Is="method" /> 
        <Kind Is="operator" /> 
        <HandlesEvent /> 
       </Or> 
       <Not> 
        <Kind Is="destructor" /> 
       </Not> 
      </And> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Static /> 
      <Abstract /> 
      <Virtual /> 
      <Override /> 
      <Name /> 
     </Sort> 
     <Group Region="Methods" /> 
    </Entry> 

    <!-- all other members --> 
    <Entry /> 

    <!-- nested types --> 
    <Entry> 
     <Match> 
      <Kind Is="type" /> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Static /> 
      <Abstract /> 
      <Virtual /> 
      <Override /> 
      <Name /> 
     </Sort> 
     <Group Region="Nested Types" /> 
    </Entry> 
</Pattern> 

34

Z korzyścią dla ludzi, jak ja, którzy wylądowali na to pytanie za pośrednictwem wyszukiwarki internetowej, ale okazało się, że szczegóły na pytanie nie było całkiem to, czego spodziewaliśmy się, może chcesz wiedzieć, że możesz przesuwać poszczególnych członków w obrębie pliku, przytrzymując klawisz Ctrl-Alt-Shift, a następnie naciskając strzałki w górę lub w dół.

(Oczywiście to nie jest zautomatyzowany układ według kolejności alfabetycznej zadawane w korpusie pytanie, ale to była odpowiedź Miałem nadzieję, że znajdę na pytanie w tytule).

+0

Jest to przydatna informacja, która może być przydatna dla osób natkną się na to pytanie. Znalazłem to, czego szukałem w oryginalnym poście z wysoką odpowiedzią na głosowanie, ale odpowiedź zawierała pomocny skrót, który można używać w locie. –

+1

Dodałbym, że możesz kliknąć Ctrl + M, Ctrl + 0, aby zwinąć wszystkie metody. Następnie możesz przenosić bloki metod, jak opisano powyżej. – jwize

+0

Dziękuję, to właśnie tu przyjechałem. – NJH

0

z Visual Studio menu;

ReSharper> Opcje> Środowisko> IntelliSense> Zakończenie Zachowanie> Uporządkuj przedmioty (alfabetycznie)

33

Sortowanie nie jest włączona domyślnie. Można go aktywować otwierając opcje ReSharper a następnie przejdź tutaj:

enter image description here

+0

wygląda na to, że nie ma opcji zmiany kolejności klas w tym samym pliku według nazwy ... czy wiesz, czy to możliwe? – montelof

+3

Nie wiem. Nigdy nie umieszczam wielu klas w tym samym pliku. – jgauffin

+0

Dzięki! Dokładnie to, czego szukałem. To działało świetnie. – aoakeson

0

Jeśli porządkowania parametry dotyczące konkretnych metod, można użyć byłaby> Zmień Podpis jeśli kursor znajduje się na nazwę metody. Używam skrótów IntelliJ, więc dla mnie polecenie to Ctrl + Shift + R, a następnie Ctrl + F6.

Refactor context menu

Po robią tak, to pojawi się okno dialogowe, które pozwala parametry metody przywrócenia porządku. Zmodyfikuje nawet wszelkie implementacje interfejsu.

Powiązane problemy