类中项目的顺序:字段,属性,构造函数,方法

时间:2020-03-06 14:53:40  来源:igfitidea点击:

在班级结构方面,是否有关于物品顺序的官方指导方针?否。否。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

它会去吗:

  • 公共领域
  • 私人领域
  • 特性
  • 建设者
  • 方法 ?

我很好奇,关于项目顺序是否有严格的规定?我到处都是。我想坚持一个特定的标准,所以我可以在任何地方都可以做到。

真正的问题是我的更复杂的属性最终看起来很像方法,并且它们在构造函数之前的顶部感觉不合适。

有任何提示/建议吗?

解决方案

语言中肯定没有任何东西可以以任何方式强制执行它。我倾向于按可见性(公共,然后受保护,然后私有)对事物进行分组,并使用#region在功能上对相关事物进行分组,无论它是属性,方法还是其他。构造方法(无论是实际的ctor还是静态的工厂功能)通常位于顶部,因为它们是客户首先需要了解的。

我见过的唯一建议的编码准则是将字段放在类定义的顶部。

我倾向于把构造函数放在下一个。

我的一般评论是,我们应该在每个文件中坚持一个类,并且如果该类足够大,以至于属性和方法的组织是一个大问题,那么该类有多大,我们是否应该重构它?它代表多个问题吗?

我们可能会发现最接近的是Brad Abrams撰写的"设计指南,托管代码和.NET Framework"(http://blogs.msdn.com/brada/articles/361363.aspx)

这里概述了许多标准。我认为相关的部分是2.8.

我不了解某种语言或者行业标准,但我倾向于按以下顺序排列内容,每个部分都包含在#region中:

使用语句

命名空间

班级

私人会员

公共财产

建设者

公开方法

私人方法

我建议使用IDesign或者Brad Abram网站上列出的编码标准。这些是我发现的最好的两个。

布拉德会说...

Classes member should be alphabetized, and grouped into sections (Fields, Constructors, Properties, Events, Methods, Private interface implementations, Nested types)

与其按可见性或者按项目类型(字段,属性,方法等)分组,不如按功能分组?

从StyleCop

私有字段,公共字段,构造函数,属性,公共方法,私有方法

由于StyleCop是MS构建过程的一部分,因此我们可以将其视为事实上的标准

如前所述,语言中没有任何内容可以规定布局,我个人使用区域,并且对于普通班级,我会做类似的事情。

public class myClass
{
#region Private Members

#endregion
#region Public Properties

#endregion

#region Constructors

#endregion
#region Public Methods

#endregion
}

反正对我来说还是有道理的

我更喜欢将私有字段和构造函数放在顶部,然后在其后放置公共接口位,然后是私有接口位。

同样,如果类定义足够长,以至于项目的排序很重要,那么这可能是代码气味,表明类过于庞大和复杂,我们应该进行重构。

通常我会尝试遵循以下模式:

  • 静态成员(通常具有其他上下文,必须是线程安全的,等等)
  • 实例成员

每个部分(静态和实例)由以下成员类型组成:

  • 运算符(始终是静态的)
  • 字段(在构造函数之前初始化)
  • 构造函数
  • 析构函数(遵循构造函数的传统)
  • 特性
  • 方法
  • 大事记

然后,成员按可见性排序(从不可见到更明显):

  • 私人的
  • 内部的
  • 内部保护
  • 受保护的
  • 上市

顺序不是教条:简单的类更易于阅读,但是,更复杂的类需要特定于上下文的分组。

我让它尽可能简单(至少对我来说)

枚举
声明书
建设者
覆写
方法
特性
事件处理程序

根据StyleCop规则文档,顺序如下。

在类,结构或者接口中:(SA1201和SA1203)

  • 常数场
  • 领域
  • 建设者
  • 终结器(析构函数)
  • 代表们
  • 大事记
  • 枚举
  • 介面
  • 特性
  • 索引器
  • 方法
  • 结构
  • 班级

在以下每个组中,按访问顺序排序:(SA1202)

  • 上市
  • 内部的
  • 受保护的内部
  • 受保护的
  • 私人的

在每个访问组中,先按静态,然后按非静态顺序排序:(SA1204)

  • 静态的
  • 非静态

在每个静态/非静态字段组中,按只读顺序排序,然后按非只读顺序排序:(SA1214和SA1215)

  • 只读
  • 非只读

展开的列表长130行,因此在这里我不会展开。展开的方法部分是:

  • 公共静态方法
  • 公开方法
  • 内部静态方法
  • 内部方法
  • 受保护的内部静态方法
  • 受保护的内部方法
  • 受保护的静态方法
  • 受保护的方法
  • 私有静态方法
  • 私人方法

该文档指出,如果规定的顺序不合适,则说明正在实现多个接口,并且应该将接口方法和属性组合在一起,然后使用局部类将相关的方法和属性组合在一起。