【问题标题】:How to reorder type members with Resharper?如何使用 Resharper 重新排序类型成员?
【发布时间】:2010-11-29 05:37:56
【问题描述】:

典型场景:很多人都在学习的课程。我想按字母顺序对方法、属性等进行排序。

我希望能够在该地区或全球范围内的课堂上做到这一点。

我看到 Resharper 中的功能可以做到这一点,但它似乎没有做任何事情。

【问题讨论】:

  • 谢谢大家。我最终安装了一份我已经拥有但自 2006 年以来未使用过的 MZ Tools 的副本。它具有该功能并且运行良好。
  • 同样的事情也发生在我身上。它工作得很好,然后就停止了。

标签: c# resharper


【解决方案1】:

要考虑的替代方案是区域化。我们使用和喜欢 ReSharper,但 Regionerate 适合我们创建区域和排序/重新排列成员的需求。当然,这一切都是可定制的。

更新:我们已经开始使用 ReSharper's Code Cleanup 来代替。

【讨论】:

  • 我们使用了大约 2 周,但是当嵌套区域的扩散感染了我们的代码时,我们都将其丢弃了。这当然是个人喜好问题,但请确保你们都同意如何使用它......
  • @zzzuperfly:是的,每个人都需要就标准达成一致,你需要调整配置。
  • 如果你使用区域通常表明你的类太大了,大 = 类意味着你每个类的职责太多
  • @Miau:虽然我相信单一职责原则,但最好将属性/公共方法/构造函数/私有方法/字段分成各自的区域并按字母顺序排列。
  • 一般地区有代码味道。区域隔离和隐藏代码。同样的事情可以用类和方法来完成。
【解决方案2】:

jgauffin 的答案很接近,但我发现(使用 R# 2017)要重新排序属性,我需要单击“文件布局”对话框标题中的“XAML”选项并进行更改

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

“排序依据”属性为空且只读,这是有道理的,因为它仅用于具有相同名称的项目(并且所有属性都应唯一命名)

【讨论】:

    【解决方案3】:

    如果您正在对特定方法的参数重新排序,如果您的光标位于方法名称上,则可以使用 Refactor > Change Signature。我使用 IntelliJ 快捷键,所以对我来说,命令是 Ctrl+Shift+R,然后是 Ctrl+F6。

    完成此操作后,将弹出一个对话框,允许您重新排序方法参数。它甚至会重构接口的任何实现。

    【讨论】:

      【解决方案4】:

      默认情况下不激活排序。您可以通过打开 resharper 选项来激活它,然后转到此处:

      【讨论】:

      • 看起来没有选项可以按名称对同一文件中的类重新排序...你知道这是否可能吗?
      • 我不知道。我从不在同一个文件中放置多个类。
      • 仅供参考 - 更改选项后,它仍然无法正常工作。我不得不重新启动VS,然后它工作了。
      • 我还必须将“接口实现”选项更改为按名称排序,然后按无排序。重新启动 VS 后,它终于起作用了。所以,简而言之,我浏览了模式中的所有选项,并将每个选项设置为按名称排序:D
      • 接口实现成员按接口中的顺序排序。因此,如果您首先使用界面,然后类都会正确。
      【解决方案5】:

      从 Visual Studio 菜单中;

      ReSharper > 选项 > 环境 > IntelliSense > 完成行为 > 排序项目(按字母顺序)

      【讨论】:

      • 这是 Intellisense 中出现的项目的排序顺序,按相关性或字母顺序
      【解决方案6】:

      为了像我这样通过网络搜索找到这个问题但发现问题的细节与他们所期望的不太一样的人的利益,您可能想知道您可以将个别成员向上移动并通过按住 Ctrl-Alt-Shift 然后按向上或向下箭头在文件中向下移动。

      (显然这不是问题正文中要求的按字母顺序自动排列,但这是我希望在标题中找到问题的答案。)

      【讨论】:

      • 这是有用的信息,对遇到这个问题的人很有用。我在原始帖子中找到了我正在寻找的高投票答案,但您的答案提供了一个有用的快捷方式,可以随时使用。
      • 我想补充一下,你可以点击 ctrl+m,ctrl+0 折叠所有方法。然后,您可以如上所述移动方法块。
      • 请注意,这是 ctrl-m-oh 而不是 ctrl-m-zero (无论如何,在我的机器上)。或编辑 > 大纲 > 折叠到定义
      • 我想到的第一件事是......太棒了:-)
      【解决方案7】:

      两件事:有一个已知(但没有大量记录)条件,其中预编译条件(例如#if DEBUG)将停止类型成员重新排序。 http://youtrack.jetbrains.com/issue/RSRP-336643#tab=Comments 换句话说,如果您有#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>
      

      【讨论】:

        【解决方案8】:

        使用“清理代码”功能。

        可以在语言、C#、类型成员布局的 ReSharper 选项中设置成员的顺序。这是一个有据可查的 XML 布局规范,ReSharper 在重新排序成员时使用它。

        【讨论】:

        • @Kyle,如果您告诉 R# 重新排序成员并且您的布局规范是正确的,那么它确实有效。有关详细信息,请参阅 R# 文档;某些类型(例如单元测试类和具有顺序布局属性的互操作结构)没有重新排序,因为顺序可能有意义。
        • 我在 R# 规范中看不到任何关于按字母顺序排序的内容。
        • @manu08,参见JetBrains help on the topic - 您可以添加&lt;Sort&gt;&lt;Name/&gt;&lt;/Sort&gt; 以在重新排序配置 XML 中按名称排序。
        • 为了让其他人想知道为什么他们的接口实现属性没有重新排序 - 有一个单独的接口实现配置元素默认情况下没有为我排序。
        • 应该低头看jgauffin下面的帖子,默认是没有开启排序的。
        猜你喜欢
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 1970-01-01
        • 2018-07-06
        • 1970-01-01
        相关资源
        最近更新 更多