如何在C#中命名私有变量?[关闭]


25

什么是C#中私有变量的最佳实践和最普遍接受的命名约定?

  1. private int myInteger;
  2. private int MyInteger;
  3. private int mMyInteger;
  4. private int _myInteger;
  5. private int _MyInteger;
  6. 神秘的其他选择

您使用哪个?为什么?(我的公司对C#来说还很陌生,我想选择一种最“行业认可”的方法来尝试进入我们的编码标准。)


为什么不使用自动实施的属性?msdn.microsoft.com/zh-CN/library/bb384054.aspx
Kyle Ballard 2010年


7
在公共场合谈论私有变量不是很好。对不起,只好。
Mark C 2010年

除了在方法的局部作用域内仅使用_someVariable外,我使用与azheglov(m_someVariable)相同的方法。
主福

7
@Mark我认为这应该是“私人成员”,以示启发。
EpsilonVector 2010年

Answers:


44

MSDN类设计指南http://msdn.microsoft.com/zh-cn/library/ta31s3bc.aspx建议使用选项1-myInteger。

我一直使用这种风格。我个人不喜欢_字符。


1
我不喜欢_字符,直到resharper为智能添加了中间字符串匹配。现在我可以输入myInteger,它将与匹配_myInteger。但是我不知道MSDS说不要使用_
Vaccano 2010年

4
如果使用选项1,如何确定myInteger方法变量是本地变量还是私有类成员?
Wizard79 2010年

4
@Lorenzo this.myInteger;)
TWith2Sugars

12
但是……“这个”是4个字符,“ _”只是一个字符!实际上,该指导方针很有道理,但是在我的办公室里,无论出于何种原因,每个人都喜欢下划线,并且讨厌看到“ this.Foo”。有时,唯一重要的准则是您的工作场所强制您使用的准则。
CodexArcanum

2
关于字符数的争论值得商bat。您不必this每次都键入,只需在存在相同名称的局部变量的方法中键入即可。但是,如果使用下划线,则每次都需要写一个额外的符号。我同意,遵守您的本地代码样式协议始终很重要。
马尔科姆

25

我使用上面的选项4:

private int _myInteger;

我希望在变量名中有范围的指示,而下划线足以满足此目的。它也很容易阅读。


5
我不同意它易于阅读,尤其是在必须使用多个变量进行操作的情况下。
Restuta

15

我使用以下命名方案:

  • 第一个(myInteger)用于局部范围的变量
  • 公共财产第二名(MyInteger)
  • 私有变量第4个(_myInteger)

14

我认为选项4确实是最易读的选项。它可以帮助您避免这样做:

public Person(string name, int age) 
{
    this.name = name;
    this.age = age;
}

这也使所有私人成员更加引人注目。在以下示例中,到底是哪里age来的?没有this预选赛,很难说。

private void Method()
{
    var x = 2;
    var y = age + x;
}

这是更容易理解的方式:

private void Method()
{
    var x = 2;
    var y = _age + x;
}

1
我曾经在第一个示例中发誓,但是在尝试了选项#4一段时间之后,我更喜欢使用下划线作为私有字段的前缀。
Jeremy Wiebe'9

2
我说,使用1表示私有变量,使用4表示属性中使用的私有变量。
Evan Plaice

2
我不同意ChaosPandoin。对我而言,Method()的两种实现都易于阅读。当我看到age变量(或_age)并注意到它没有在方法中声明时,我意识到必须在类的其他地方声明它。这个限定词很糟糕,但至少限于构造方法。
大卫·肯尼迪

10

首先,PascalCasing通常保留给该类的公共属性,const,方法等。所以我将跳过2和5。

其次,在.NET世界中不鼓励使用匈牙利表示法,因此(嗯,我认为)3是正确的。假设这就是3。

剩下的就是camelCasing和_camelCasing。我通常将_camelCasing用于类变量,将普通的camelCasing用于范围为方法或更窄范围的变量。骆驼套是用于方法自变量,受保护/专用变量名称以及方法内或更窄范围内的变量的公认标准。

我还喜欢在下划线前加上前缀,以便将我的私有变量归为智能感知。但是,我仅对范围限定为类型的变量执行此操作。在方法或更狭窄的范围内声明的变量我不使用下划线。使它们容易分开并将较少使用的变量保持在一起很容易。


2
我不明白为什么要对类变量使用_camelCasing,因为通常很明显它们是类变量。
替代

1
@数学不,它在智能感知中并不明显。请记住,字段(类作用域变量)与方法范围的变量具有(几乎)相同的图标,因此,如果您不仔细看,它们看起来完全相同。下划线有助于在视觉上区分它们并将它们分组在一起,这在您不经常使用它们时会有所帮助(由于状态是无错误编程的敌人,因此不应使用它们)。
扯掉

我从没说过有关Intellisense的信息。我说的是Color.ClassMethod()和myColor.InstanceMethod()之间的区别,即因为Color是一个类,所以ClassMethod()是一个类方法,这是显而易见的。
替代

@之前I don't understand why you would use _camelCasing for class variablesI'm talking about the difference between Color.ClassMethod() and myColor.InstanceMethod()请给您: 之后,请您: 当我感到困惑时,请原谅。听着,我很少使用类变量,因此很高兴通过单击_并让它们全部出现在智能提示中并进行分组来提醒它们的名称。
扯掉

2
@mathepic:当威尔说“类变量”时,他的意思是(私有)实例字段。您似乎已经解释了他所说的静态成员。但这不是他说的。
丹涛2010年

4

private int integer

如果您在方法范围内的成员变量和局部变量之间感到困惑,则可能需要重构。


+1:我认为这就是重点。顺便说一句:我看到了它的来历,但是integer最好改写这个名字,也许value吧?
狼2014年

2

我相信最好的方法(无论如何在C#/。net中)是2和6的组合:

private int MyInteger { get; set; }

从理论上讲,这里根本没有任何变量,但是它看起来和作用就像一个私有实例变量。如果我们需要为该价值添加一些业务逻辑(这是一个完全内部的价值,那么我们毕竟可以做我们想做的任何事情),那么它已经为我们实现了“属性化”。一个热气腾腾的胜利杯!


2

我选择选项4,因为这就是SSCLI的样子,但是说实话,我不太在意私有变量的命名。公开是一个不同的故事。

顺便说一句,您忘记了m_MyInteger


2

我什么都不会称呼它!

但是我会说

class C
{
     int VariableName { get; set; }
}

通常,这比拥有显式变量更好。如果我有一个明确的私有变量,我会称之为int _variableName;


1

在C ++中,我倾向于使用_,因为我经常切换编辑器,这不允许我查看它是否是私有的。

对于C#,我倾向于忽略_,因为Visual Studio允许我查看它是否私有。

我倾向于使用驼峰案例的方式来做到这一点。


1

我使用4(private int _myInteger;)是因为:

private int myInteger;

这就是我命名局部变量的方式。

private int MyInteger;

这就是我命名常量的方式。

private int mMyInteger;

这不是C#样式。

private int _MyInteger;

这看起来很奇怪。



1

您需要给出一个更具体的示例,但是:

private int countprivate int badFileCountprivate static readonly int ReconnectAttemptsLimit

顺便说一句,当您安装并开始使用最新版本和greatest时,就可以免费获得所有这些功能MSFT Stylecop


0

我选择选项5: private int _MyFoo

不过,我看不出与_myFoo相比有任何真正的竞争优势。


0

使用camelCasing处理私有变量,例如 myInteger

考虑前述_如果变量是一个备份一个属性,以减少confusions-
变量_myProperty为属性MyProperty


0

我有ReSharper命名我的变量,不仅是我的变量,其他所有人也都这样做。该项目有很多一致性。


0

Juval Lowy的IDesign C#编码标准非常受欢迎。该标准建议在私有成员变量前面加上“ m _”(选项6)。这就是我们在团队中所做的。

private int m_myInteger;

选项4(_myInteger)是此标准的可接受的变体。

我不喜欢MSDN建议(myInteger),因为它很难从局部变量中告诉私有成员。当然,他们的建议通过使用限定私人成员的this身份来解决此问题,这对我来说似乎是多余的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.