布局C#类的最佳方法是什么?

时间:2009-03-02 20:01:48

标签: c# coding-style

是否有标准的方式来布置C#文件?如在,Fields,然后是Properties,然后是Constructors等?

这是我通常做的,但我想知道是否有标准方式?

  1. 嵌套类或枚举
  2. 字段
  3. 属性
  4. 活动
  5. 构造
  6. 公共方法
  7. 私人方法
  8. 人们将他们的字段组合在一起,还是将他们放在属性中?或者人们不担心订单? Visual Studio似乎让它变得如此困难。

    修改:在此处移动了有关ReSharper的其他部分:Make Resharper respect your preference for code order.

10 个答案:

答案 0 :(得分:54)

我倾向于使用Microsoft StyleCop,其根据规则SA1201具有设定顺序:

  

原因 C#代码中的元素   文件与...有关   代码中的其他元素。

     

规则说明违反此规定   规则发生在代码元素时   在文件中不遵循标准   订购方案。

     

遵守这条规则,要素在   文件根级别或在   命名空间必须位于   以下顺序:

     
      
  • 外部别名指令
  •   
  • 使用指令
  •   
  • 命名空间
  •   
  • 代表
  •   
  • 枚举
  •   
  • 接口
  •   
  • 的Structs
  •   
  •   
     

在类,结构或接口中,   元素必须放在   以下顺序:

     
      
  • 字段
  •   
  • 构造
  •   
  • 终结者(破坏者)
  •   
  • 代表
  •   
  • 活动
  •   
  • 枚举
  •   
  • 接口
  •   
  • 属性
  •   
  • 索引器
  •   
  • 方法
  •   
  • 的Structs
  •   
  •   
     

遵守标准订购   基于元素类型的方案可以   增加可读性和   文件的可维护性和   鼓励代码重用。

     

实现接口时,它是   有时希望将所有人分组   接口的成员旁边的一个   另一个。这有时需要   违反此规则,如果接口   包含不同类型的元素。   这个问题可以通过以下方法解决   使用部分类。

     
      
  1. 如果该类尚未添加,则将部分属性添加到类中   部分。

  2.   
  3. 添加具有相同名称的第二个分部类。可以放置   这个在同一个文件中,就在下面   原始课程,或在一秒钟内   文件

  4.   
  5. 移动接口继承和接口的所有成员   实施到第二部分   上课。

  6.   

答案 1 :(得分:9)

我认为没有最好的方式。布局时需要考虑两个重要的事项。第一个最重要的是一致性。选择一种方法并确保整个团队同意并应用布局。其次,如果你的课程变得足够大,你正在寻找那些讨厌的属性所在的地方(或者必须实现区域以使它们更容易找到),那么你的课程可能太大了。考虑嗅探它,并根据你的味道进行重构。

要回答转化器问题,请在选项(位于 C#节点下)的键入成员布局下进行检查。这并不简单,但可以更改布局顺序。

答案 2 :(得分:2)

我不相信地区必然是坏代码的标志。但要确定您必须审查您拥有的内容。正如我已经说过here这就是我将代码区域化的方式。


枚举
声明
构造函数
方法
事件处理程序
属性

但最主要的是保持一致和有目的。

答案 3 :(得分:1)

我倾向于聚集私人数据,并倾向于在功能组中聚集相关的方法/属性。

public class Whatever {
   // private data here
   int _someVal = kSomeConstant;

   // constructor(s)
   public Whatever() { }

#region FabulousTrick  // sometimes regionize it
   // fabulous trick code
   private int SupportMethodOne() { }
   private double SupportMethodTwo() { }
   public void PerformFabulousTrick(Dog spot) {
       int herrings = SupportMethodOne();
       double pieces = SupportMethodTwo();
       // etc
   }
#endregion FabulousTrick
   // etc
}

答案 4 :(得分:1)

您可以尝试使用Regionerate来帮助解决此问题。我非常喜欢它,这是Scott Hanselman的选择。

答案 5 :(得分:1)

如上所述,我认为没有最好的方式。但有些组织确实帮助了程序员。

在漫长的项目中,您经常花一些时间来查找一个或多个源文件,试图找到您的某个功能。

所以我以这种方式大量使用#region -

  1. region事件:此类使用的所有事件引用(至少在此特定的分部类中)。

  2. 区域控件:与表单上的控件直接交互的所有函数。

  3. 区域MDI :将mdi设置为

    然后会有一些功能而不是界面,

  4. 区域正则表达式搜索

  5. 我随着时间的推移做了一些补充,但是我总是使用相同的模式。我必须说一些程序员在接受我的工作后会告诉我这很容易理解,而其他程序员则很麻烦。

    你可以一半的时间和一半的四分之一的时间取悦一半的人,而另一半的时间你会让包括你自己在内的所有人感到困惑。我认为Winston Chrchil说过。

答案 6 :(得分:0)

无论是什么让你更有成效。有些像属性访问器旁边的私有字段,有些像构造函数上方的字段一样。可以帮助的最重要的事情是分组“喜欢”元素。我个人喜欢将私人方法,私人财产等整合在一起。

不断尝试一些事情,无论你感觉如何,都会提高你的工作效率并帮助你保持代码的维护。

答案 7 :(得分:0)

每个都是他们自己的,但我倾向于遵循MSDN帮助遵循的相同顺序。

我也不喜欢嵌套类或枚举,而是为它们创建单独的文件,这也使编写单元测试更容易(因为当您需要添加/修复/重构测试时,很容易找到关联的测试文件)。

恕我直言,订单并不重要,因为VS可以很容易地找到所有成员(特别是如果你按照一个类/接口/枚举每个文件的方法),如果你想构建文档,Sandcastle会将它们分组,所以我更关心给他们有意义的名字。

答案 8 :(得分:0)

除了在类文件中保持一致的区域集之外,我还按字母顺序保留区域的所有组件。在阅读代码时,我倾向于有一些“视觉记忆”,这让我疯狂地不得不使用导航下拉列表在文件中查找代码,因为它遍布整个地方。

答案 9 :(得分:0)

我使用以下布局:

事件 全局/类范围的字段 私人/内部    性能    方法 公共/保护    性能    方法 嵌套类(尽管我尽可能避免使用这些类)

我还坚信每个文件有一个代码“thing”(类,接口或枚举),文件名与“thing”名称相同。是的,它创造了一个更大的项目,但它使得查找事物变得更加容易。