.NET类型的私有成员命名规范

34
通常情况下,当我在类或结构体中有私有字段时,我使用小驼峰命名法(camelCasing),这样当您看到它的名称时,很明显它确实是私有的。但是,在我的一些同事的C#代码中,我发现他们通常使用m_或者有时_,好像有某种约定。
.NET命名约定难道不禁止您使用下划线作为成员名称吗?
当您提到MS命名约定或其他内容时,他们会告诉您他们的方式是最好的方式,但不解释其背后的原因。
此外,当我拥有某些代码时,我明确使用小驼峰命名法(camelCasing)用于私有成员,但当他们需要对代码进行轻微修改时,他们会插入他们自己的约定,而不是遵循任何约定。
这是一个争议吗?

相关问题,如非重复:https://dev59.com/hm855IYBdhLWcg3wGQNM - VMAtm
10个回答

29

.Net框架指南允许在私有字段名称上使用_m_前缀,因为它们对私有字段没有提供任何指导性的规范。如果你在反编译器中查看BCL(基础类库),你会注意到前缀是最普遍的模式。

命名字段的参考页面位于这里。请注意,该指南仅针对公共和受保护的字段使用,私有字段则没有涵盖。


1
我不知道他们改变了规则。 - Joan Venge
2
你能给我提到的“.Net框架指南”提供一个链接吗?我知道有两篇“设计准则”的MSDN文章,但据我所知,它们没有提到私有字段。 - stmax
这是不正确的:字段名称部分指出:不要为字段名称使用前缀。 - VMAtm
正如这个答案所述,微软的.NET命名指南(由Visual Studio的Code Analysis工具强制执行)并不要求私有类型和成员遵守:“尽管采用这些命名约定作为通用代码开发指南将在整个代码中产生更一致的命名,但您只需要将它们应用于公开暴露的API(公共或受保护的类型和成员以及显式实现的接口)。" - DavidRR

21
从技术上讲,下划线是违反.NET惯例的(或者至少曾经是--请参见注释线程),但是微软的程序员经常使用下划线,在文档中也有很多示例使用下划线。我认为能够一眼看出哪些变量是成员变量(字段),哪些是局部变量非常有帮助。下划线真的有助于此。它还能在智能感知中很好地区分私有成员变量和局部变量。
请查看这个非常有用的.NET命名约定页面: http://10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices 这里还有一个微软官方推荐的页面: https://msdn.microsoft.com/en-us/library/ms229045%28v=vs.110%29.aspx

9
更新后的.Net设计指南并没有违反规定。 - JaredPar
2
@Jared,谢谢,你能提供一个参考吗?我在文档的这个区域没有看到它:http://msdn.microsoft.com/en-us/library/xzf533w0%28VS.71%29.aspx - devuxer
4
@DanM,尝试使用以下链接。请注意,指南仅涵盖公共和受保护成员的命名。http://msdn.microsoft.com/en-us/library/ms229012.aspx - JaredPar
3
@Jared,我仍然没有看到任何有关下划线的提及。所以,微软可能正在尝试在这个问题上保持中立? - devuxer
7
@Steven,而且 m_portNumber 不仅难看,还会影响可读性。基本上,m 这部分挡住了 portNumber 部分的视线。 - devuxer
显示剩余4条评论

13

通常我用下划线为私有成员变量加前缀。

这样做可以让你在阅读代码时更容易发现它们,而且符合微软指南的要求:

public class Something
{
    private string _someString = "";

    public string SomeString
    {
        get
        {
            return _someString;
        }
        set
        {
            // Some validation
            _someString = value;
        }
    }
}

正如其他人所说,更重要的是要保持一致性。如果你在一个遵守 m_ 命名规范的团队中,不要试图反叛并采用其他方式。这只会给其他人带来更多的困难。


3
适应团队标准值得点赞。 - Gad

4

微软不参与这两个选项中的任何一个。

如果在Visual Studio中使用“重构->封装字段…”来封装字段:

private string _myVar

private string myVar

它们都会生成一个类似于这样的属性:

public string MyVar
{
    get { return myVar; }
    set { myVar = value; }
}

对于微软来说也是一样的 :-) 只需要与开发团队达成协议,让每个人都使用相同的方法。

通常情况下,除非特定情况下,我从不使用私有字段。我使用受保护的属性封装私有字段。这样更适合继承,并且在我看来更加清晰明了。


3
即使在BCL中,您也会看到很多不一致的命名约定,有些类有“_”,有些有“m_”,还有一些只是属性的帕斯卡大小写版本。
下划线很好,因为它可以防止意外堆栈溢出,尽管更近期的Visual Studio版本已经警告了这一点。它们也首先出现在您的智能感知中,避免了需要在代码中添加this.someProperty或搜索整个列表的需要。
只要团队同意一个标准,就不会有太大的区别,但是使用下划线5年以上后,我个人不想返回其他替代方案。
如果拥有代码库并维护它,则应坚持使用您的标准。如果他们不这样做,那么简单地重构它并附上一封礼貌的电子邮件说明您为什么这样做即可。

谢谢,但是下划线如何防止堆栈溢出? - Joan Venge
我已经更新了一个链接。这可能看起来有点牵强,但我已经遭受过几次这种情况的困扰。 - Chris S
@Joan:我认为他的意思是当应该引用“_foo”时,没有将Foo属性引用为“Foo”。 - John Saunders
我丢失了对答案的更改,但基本上 @John 是的,尽管听起来很愚蠢,但在过去几次中,我曾因引用帕斯卡命名法属性而不是驼峰命名法而受到伤害(在切换到下划线之前)。 - Chris S
这就是我所说的:https://dev59.com/EXVC5IYBdhLWcg3wnCaA#241194 - Chris S

2
有两篇MSDN文章(这里这里)介绍了设计准则并包含命名约定。遗憾的是,它们仅限于“公开可见”的内容。它们不提供非公开内容的命名指南,而据我所知,微软也没有为非公开内容提供官方命名指南。 StyleCop(一种微软工具)反对在名称中使用下划线。开发人员之所以喜欢使用下划线有两个原因:
  • 它清楚地标记出非公开成员(键入_,智能提示将显示所有非公开成员)。
  • 它防止局部变量(通常也写成camelCase)、方法参数和非公开字段之间的冲突。
在我看来,这两个原因都是使用下划线的好理由,但我不喜欢它让我的代码看起来很混乱,所以我也不使用它。我更喜欢尽可能只使用camelCase,并在与局部变量或方法参数冲突时添加this。
我们只是尝试保持团队和项目内的编码风格一致。

2
@stmax:我的理解是,StyleCop是由一个团队开发来维护其标准的。我不认为它代表了像FxCop那样经过深入研究的公司范围内最佳实践的集合。 - John Saunders

2
请查看MS字段使用指南的最后一段。
不要对字段名称或静态字段名称应用前缀。特别是,不要应用前缀来区分静态和非静态字段。例如,应用g_或s_前缀是不正确的。

5
我认为这是针对受保护和公共字段的。 - Ivan G.
@IvanG。不,根据成员设计指南,不允许使用publicprotected实例字段。 - VMAtm
Ivan G. 对于常量和静态只读字段是正确的:“使用常量字段来表示永远不会改变的常量。使用公共静态只读字段来表示预定义的对象实例。” - DavidRR

1

没有规定阻止您使用有效的标识符名称。重要的是要保持一致性。我使用“_”表示所有私有变量,尽管“正确的方式”(例如ReSharper)似乎希望您以小写字母开头声明它们,并通过使用“this.”来区分参数和成员。


2
我认为这太啰嗦了。像 _portNumber 这样的命名似乎非常清晰,而 this.portNumber 则增加了长度但没有增加清晰度,并且看起来太像 Java 风格了。除了美学之外,在这些情况下 this. 在语法上是多余的。 - Steven Sudit
1
@StevenSudit 等人:在编写代码时,使用 this. 可以极大地减少 Intellisense 建议的起始池,除了从一个字符(即 this.i)开始工作外,还可以通过 this. 让您扫描本地成员列表以更快地启动您的大脑。因此,虽然阅读代码是冗余的,但在编写代码时肯定是有帮助的。 - drzaus
@drzaus - 什么构成了Intellisense池,可能会因使用此功能而减少?全局/静态变量?那不太好。 - Otávio Décio
@OtávioDécio 我有ReSharper,所以它可能比通常更具攻击性,但这取决于上下文。我经常在“其他人”的代码中工作--一些类有很多“get”方法,因此输入“ge”会显示20多个方法以及每个命名空间中以“Generic”开头的所有类等等。而且我曾经使用过许多静态助手库,所以这增加了列表长度。即使Intellisense会进行一些智能排序,使相关内容通常位于列表顶部,但这仍然是我宁愿避免的认知混乱。 - drzaus
@drzaus - 好的,我理解你的观点。如果这对你来说是最好的选择,那就尽管去做吧。 - Otávio Décio
显示剩余3条评论

1

我并不相信有最好的变量和方法书写规范,最重要的是你和你的团队必须保持一致。微软指定的.NET命名约定非常好,但有些人更喜欢其他约定...

就个人而言,我通常会在私有变量和方法前加"_",然后使用骆驼式大小写,保护级别的变量和方法采用骆驼式大小写,公共变量和方法则采用帕斯卡式大小写,但这只是我个人的偏好。


1
最好的方式是编程团队已经同意遵循的方式。 - Steven Sudit

1

是的,StyleCop(强制执行MS编码规则)强制执行的命名约定是“无下划线,驼峰式”用于私有实例字段。

值得注意的是,常量/静态只读字段采用“帕斯卡命名法”(必须以大写字母开头但不能全部大写)。

其他命名约定是C++风格的遗留物,这是最初用于编写C#的样式,因为C#团队来自C++。

重要提示:是否使用此编码样式完全取决于开发团队。更重要的是,团队中的每个人都使用相同的样式,而不是使用任何特定的样式。
另一方面,MS在经过深思熟虑后选择了这种样式,因此我将其用作决定性因素。如果没有特别的原因去选择编码样式,我会按照StyleCop的方式进行。


谢谢,常量/静态只读字段的惯例是什么? - Joan Venge
3
由于没有官方的Microsoft标准编码指南,因此这是不正确的。最接近的是.Net框架设计指南,但它并没有关于私有字段命名的规定。StyleCop选择非前缀私有字段的约定,但这不是MS标准。 - JaredPar
1
实际上,你是错误的。StyleCop是微软的标准:http://blogs.msdn.com/sourceanalysis/archive/2008/05/23/announcing-the-release-of-microsoft-source-analysis.aspx - Task
@任务:Jared来自微软。此外,您提供的链接说“现在已经使用了多年,以帮助团队执行一套共同的最佳实践”,而不是“所有团队都在使用”。 - John Saunders
2
“在微软内部使用这个工具的大多数团队发现,在短暂的适应期之后,他们开始发现很难阅读不是按照这种风格编写的代码。” 这是最好的销售宣传! - Daniel Earwicker
1
我知道,我只是觉得有趣的是微软的一个人说他们有共同的编程风格,而另一个人则不这样认为。这是一家大公司,我不会期望每个人都编码方式相同。尽管如此,这是他们发布和使用的工具。无论它是否代表“所有人都应该遵循的官方指南”,它是他们想出的最好的东西,也是最接近的东西。 - Task

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接