我们经常会看到一个_var
在类的字段变量名。 什么是底线是什么意思? 是否有所有这些特殊的命名约定的参考?
Answer 1:
下划线是一个简单的约定; 而已。 因此,它的使用始终是每个人有所不同。 以下是我理解他们所讨论的两种语言:
在C ++中,下划线通常表明一个私有成员变量。
在C#中,我通常看到的只是定义底层的私有成员变量的公共财产时使用。 其他私有成员变量不会有下划线。 这种用法在很大程度上去用自动属性的出现,虽然路边。
之前:
private string _name;
public string Name
{
get { return this._name; }
set { this._name = value; }
}
后:
public string Name { get; set; }
Answer 2:
请C ++的任何变量名或参数名之前,请不要使用下划线!
以下划线或双下划线开头的名称被保留用于C ++实施者。 以下划线的名称被保留给图书馆的工作。
如果你有在C ++编码标准的读,你会看到,在它说的第一页:
“不要overlegislate命名,但要尽量用统一的命名规则:只有两个必到之处:1)千万不要用‘卑劣的名字,’那些以下划线开头或包含一个双下划线;” (P2,C ++编码标准,香草萨特和安德烈Alexandrescu的)
此外,你可以看到它自己,为什么开发软件时,这种使用下划线的可能是灾难性的。
尝试编译一个简单的helloWorld.cpp程序是这样的:
g++ -E helloWorld.cpp
你会看到所发生的一切的背景。 这里是一个片段:
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
__streambuf_type* __sb = this->rdbuf();
if (__sb)
{
if (__sb->pubsync() == -1)
__err |= ios_base::badbit;
else
__ret = 0;
}
你可以看到有多少名用双下划线开始!
此外,如果你看一下虚成员函数,你会看到,* _vptr是当您在课堂上使用一个或多个虚拟成员函数自动被创建的虚拟表生成的指针! 但是,这是另一个故事...
如果您使用下划线,你可能会陷入冲突的问题,你会不知道是什么原因引起的,直到为时已晚。
Answer 3:
其实_var
公约来自VB不是C#或C ++(M _,......是另一回事)。
在此之前宣布礼时克服VB的不区分大小写
例如,因为它考虑这样的代码不是在VB可能user
和User
为相同的标识符
Private user As String
Public Property User As String
Get
Return user
End Get
Set(ByVal Value As String)
user = value
End Set
End Property
因此,要解决这个问题,一些使用的约定添加“_”私人领域来这样
Private _user As String
Public Property User As String
Get
Return _user
End Get
Set(ByVal Value As String)
_user = value
End Set
End Property
由于许多惯例是.Net和保持C#等VB.NET惯例之间的一些一致性,他们使用的是同一个。
我发现我在说什么参考: http://10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices
驼峰与领先的下划线。 在VB.NET中,总是显示“受保护”或“私人”,不要使用“暗淡”。 “M_”的使用气馁,因为是利用从属性不同只的情况下,特别是受保护的变量如违反合规性的变量名,并让你的生活痛苦,如果您在VB.NET编程,因为你必须命名您的成员从东西存取/突变性质不同。 这里所有的项目,主导下划线真的是唯一的争议之一。 我个人更喜欢过来直下划线少骆驼情况下我的私有变量,这样我就不必限定变量名“这一点。” 从参数构造函数或其他地方的区别,我可能将有一个命名冲突。 随着VB.NET的不区分大小写,这是更重要的,因为你的访问属性通常具有相同的名称,除了为下划线您的私有成员变量。 至于那张M_,它实际上只是美学。 我(和许多其他人)发现M_丑,因为它看起来像有在变量名的孔。 这几乎是进攻。 我用它在VB6所有的时间,但这只是因为变量不能拥有领先的下划线。 我不能快乐看到它消失。 微软建议不要M_(和直_),即使他们做了无论是在其代码。 此外,采用了直板“M”的前缀是正确的。 当然,由于他们主要代码C#,他们可以有不同之处仅在从属性的情况下私有成员。 VB人们不得不做别的事情。 而不是试图想出语言通过语言的特殊情况下,我建议将支持所有语言的前导下划线。 如果我想我的类是完全符合CLS,我可以离开过前缀上的任何C#受保护的成员变量。 然而在实践中,我从来不担心这个,因为我让所有潜在的受保护的成员变量私人和供应保护存取函数代替。 理由:简单地说,这个约定是简单的(一个字符),容易阅读(你的眼睛不会被其他主角分心),并成功地避免了程序级的变量和类级别properties.class级属性命名冲突。
Answer 4:
第一评议(R塞缪尔Klatchko)引用: 什么是有关在C ++标识符使用下划线规则? 它回答了关于C ++中的下划线的问题。 在一般情况下,你不应该使用一个前导下划线,因为它是保留给你的编译器的实施者。 您正在看代码的_var
可能是要么遗留代码,或者有人说,长大了使用旧的命名系统,它并没有皱眉前导下划线编写的代码。
作为其他的答案状态时,它用于在C ++中使用,以确定类成员变量。 然而,它没有特殊的含义,只要装饰或语法去。 所以,如果你想使用它,它会编译。
我会离开的C#的讨论给他人。
Answer 5:
_var没有意义,只会使其更容易区分的变量是私有成员变量的目的。
在C ++中,使用_var约定是不好的形式,因为有管理在标识符的前面使用下划线的规则。 _var被保留作为一个全局标识符,而_var(下划线+大写字母)的随时保留。 这就是为什么在C ++中,您使用var_约定,而不是会看到人。
Answer 6:
你可以创建自己的编码准则。 只写了团队的其他成员清晰的文档。
使用_field帮助Intelilsense过滤所有类变量只是打字_。
我通常遵循布拉德·亚当斯准则 ,但建议不要使用下划线。
Answer 7:
对于C#微软的命名标准说变量和参数应使用低驼峰形式IE: paramName
。 该标准还要求字段遵循相同的形式,但是这可能会导致代码不清这么多球队要求的下划线前缀,以提高清晰度IE: _fieldName
。
Answer 8:
用C#,微软框架设计指南建议不要使用下划线公共成员。 对于私有成员,下划线即可使用。 事实上, 杰弗里里希特 (经常被引用的准则)使用的实例和“S_”为私有静态memberss的M_。
就个人而言,我只使用_我的私有成员标记。 “M_”和匈牙利命名法这不仅取决于在.NET皱起了眉头,但可以说是相当冗长,我发现班级,很难做到快速眼字母扫描许多成员“S_”边缘(想象10个变量都开始M_) 。
Answer 9:
我用的是_var命名为我的类的成员变量。 有2倍主要的原因我做的:
1)它帮助我跟踪类变量和局部函数变量的时候,我读书迟我的代码。
2)它有助于在IntelliSense(或其他代码完成系统)时,我正在寻找一个类变量。 只知道第一个字符是通过可用的变量和方法的列表过滤很有帮助。
Answer 10:
至于C和C ++语言的关注也没有特殊含义的域名(开头,中间或结尾)下划线。 这只是一个有效的变量名字符。 该“公约”来自编码社区内的编码实践。
如通过各种例子已经指出的上面,_在开始时可能意味着在C ++类的私有或受保护的成员。
让我举一些历史,可能是有趣的琐事。 在UNIX中,如果你有一个核心C库函数和内核要露出内核功能到用户空间为好_卡在功能存根的情况下直接做别的调用内核功能的前端后端。 这方面最有名的和熟悉的例子就是在BSD和SysV型内核的exit()VS _exit():目前,出口()做用户空间的东西调用内核的退出服务之前,而_exit只是映射到内核的退出服务。
所以_用于“本地”的东西,在这种情况下,当地存在机器本地。 通常_functions()不是便携式的。 在这你不应该期望在各种平台上相同的行为。
现在,作为_变量名,如
INT _foo;
那么心理上的_是必须键入在开始一个奇怪的事情。 所以,如果你想创建,将有别的东西发生冲突的机会较小的变量名,尤其是与预处理器替换打交道时,你要考虑的用途_。
我的基本忠告是,要始终遵循你的编码界的惯例,这样就可以更有效地协作。
Answer 11:
有没有特别的单一命名惯例,但我已经看到了对私有成员。
Answer 12:
很多人都喜欢有下划线前缀的私人领域。 这只是一个命名约定。
“S‘C#官方’命名约定规定了私有字段简单的小写名称(无下划线)。
我不知道标准约定C ++,虽然下划线的使用非常广泛。
Answer 13:
这只是一个约定一些程序员使用,使之清楚,当你操纵类的成员或一些其他类型的变量(参数,局部的功能等)。 这也是广泛使用的成员变量的另一个约定前缀与“M_”的美称。
无论如何,这些仅仅是惯例,你不会找到全部的单一来源。 他们的风格问题,并且每个编程团队,项目或公司都有自己的(甚至没有任何)。
Answer 14:
这里是一个完全合法的理由来使用它在C#中:如果代码必须是可扩展的,从VB.NET也是如此。 (否则,我不会。)
由于VB.NET是不区分大小写,有访问受保护的没有简单的方法field
成员在此代码:
public class CSharpClass
{
protected int field;
public int Field { get { return field; } }
}
例如,这将访问属性getter,而不是场:
Public Class VBClass
Inherits CSharpClass
Function Test() As Integer
Return Field
End Function
End Class
哎呀,我甚至不能写field
以小写- VS 2010只是不断修正它。
为了更便于访问VB.NET中派生类,就必须拿出另一命名约定。 前缀一个下划线可能是侵入性最小的和他们的最“历史上接受的”。
Answer 15:
现在使用的“本”作为this.foobarbaz为C#类成员变量可接受的符号。 它取代了旧的“M_”或只是“__”符号。 它确实使代码更易读,因为这是毫无疑问的是什么参考。
Answer 16:
从我的经验(肯定是有限的),下划线将表明它是一个私有成员变量。 作为咕噜说,这将取决于球队,虽然。
Answer 17:
它只是意味着它在类成员字段。
Answer 18:
当你正在阅读的代码,特别是代码,不是你自己像这样的命名规则是有用的。 强大的命名约定有助于指明特定成员的定义,它是什么样的成员,等等。大多数开发团队采用一种简单的命名约定,根本前缀的成员字段用下划线( _fieldName
)。 在过去,我已经使用C#(这是基于微软约定针对.NET框架代码,其可与反射器可以看出)以下命名约定:
实例字段:m_fieldName
静电场:s_fieldName
公共/保护/内部会员:PascalCasedName()
私人会员:camelCasedName()
这有助于迅速阅读不熟悉的代码,当人们了解成员的结构,用途,交通方便,位置。