Как изменить порядок членов с помощью Resharper?

Типичный сценарий: класс, над которым работало много людей. Я хотел бы отсортировать методы, свойства и т. Д. В алфавитном порядке.

Я хотел бы быть в состоянии сделать это в регионе или во всем мире в классе.

Я вижу функцию в Resharper, чтобы сделать это, но, похоже, ничего не делает.

8 ответов

Решение

Используйте функцию "Код очистки".

Порядок членов может быть установлен в опциях ReSharper в Языки, C#, Тип Члены Макет. Это хорошо документированная спецификация макета XML, которую ReSharper использует при переупорядочении членов.

Сортировка не активирована по умолчанию. Вы можете активировать его, открыв параметры резарпера, а затем перейдите сюда:

В интересах людей, таких как я, которые нашли ответ на этот вопрос в веб-поиске, но обнаружили, что детали вопроса не совсем то, что они ожидали, вы можете знать, что вы можете перемещать отдельных членов вверх и вниз внутри файл, удерживая нажатой клавишу Ctrl-Alt-Shift, а затем нажимая стрелки вверх или вниз.

(Очевидно, что это не автоматическое расположение в алфавитном порядке, которое запрашивается в основной части вопроса, но это был ответ, который я надеялся найти для вопроса в названии.)

Альтернативой для рассмотрения является Regionerate. Мы используем и любим ReSharper, но Regionerate соответствует нашим потребностям в создании регионов и сортировке / перестановке членов. И все это настраиваемо, конечно.

ОБНОВЛЕНИЕ: вместо этого мы начали использовать Очистку кода от ReSharper.

Две вещи: существует известное (но не сильно документированное) условие, когда условия предварительной компиляции (например, #if DEBUG) остановят переупорядочение членов типа. http://youtrack.jetbrains.com/issue/RSRP-336643 Другими словами, если у вас есть #IF DEBUG, он не будет переупорядочен.

Я также недавно заметил, что в ReSharper 8.0.1 (и, возможно, в более ранних версиях), что кнопка для возврата шаблона XML обратно в DEFAULT WITH REGIONS на самом деле не имеет никаких операторов для включения группировки #REGION. Поэтому я взял дружественный шаблону StyleCop, который включает в себя сортировку и добавил #REGION-ing для каждого члена типа. Если вы выберете CUSTOM TEMPLATE, вставьте этот XML, он должен работать.

<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>

Ответ jgauffin близок, но я обнаружил, что (с R# 2017) для изменения порядка свойств мне нужно было щелкнуть опцию 'XAML' в заголовке диалога File Layout и изменить

<Entry DisplayName="Properties, Indexers">
  <Entry.Match>
    <Or>
      <Kind Is="Property" />
      <Kind Is="Indexer" />
    </Or>
  </Entry.Match>
</Entry>

в

<Entry DisplayName="Properties, Indexers">
  <Entry.Match>
    <Or>
      <Kind Is="Property" />
      <Kind Is="Indexer" />
    </Or>
  </Entry.Match>
  <Entry.SortBy>
    <Name />
  </Entry.SortBy>
</Entry>

Свойство Sort By было пустым и доступно только для чтения, что имеет смысл, поскольку оно используется только для элементов с одинаковыми именами (а все свойства должны иметь уникальные имена)

Если вы переупорядочиваете параметры для определенных методов, вы можете использовать Refactor > Change Signature, если ваш курсор находится на имени метода. Я использую ярлыки IntelliJ, поэтому для меня команда Ctrl+Shift+R, а затем Ctrl+F6.

Рефакторинг контекстного меню

После этого появится диалоговое окно, в котором вы сможете изменить параметры метода. Он даже будет рефакторинг любых реализаций интерфейса.

Из меню Visual Studio;

ReSharper> Параметры> Среда> IntelliSense > Поведение при завершении> Сортировать элементы (по алфавиту)

Другие вопросы по тегам