变量的义务协议 C++ 和 C#

通常在“类”字段中,您可以看到变量的名称
_var

. 下划线是什么意思? 所有这些特殊命名协议是否有任何提及?
已邀请:

涵秋

赞同来自:

下划线只是一个公约,不再。 因此,它的使用对于每个人来说总是有点不同。 以下是我如何了解他们正在考虑的两种语言的方式:

在 C++ 下划线符号通常表示闭合构件变量。

在 C#, 我通常会看到它仅在确定公共属性的基本私有成员变量时使用。 其他私有成员变量将没有下划线。 然而,随着自动性质的出现,这种使用主要是离开了背景。

到:


private string _name;
public string Name
{
get { return this._name; }
set { this._name = value; }
}


后:


public string Name { get; set; }

小明明

赞同来自:

最好的东西 NOT 使用 UNDERSCORES 在任何名称变量或参数名称之前 C++

以下划线或双重下划线开头的名称是 RESERVED 对于开发人员 C++. 带有下划线的名称是为库保留的。

如果您阅读编码标准 C++, 这将看到它在第一页上写的:

"不要过载命名,但使用顺序命名协议:只有两个必需的选项:a/ 永远不要使用 "underhanded names,", 从下划线开始或包含双下划线;" /p2, C++ Coding Standards, Herb Sutter and Andrei Alexandrescu/

更详细,
http://www.open-std.org/jtc1/s ... 6.pdf
ISO 设置实际规则:

此外,一些标识符保留供实现使用。 C ++ 不应该以其他方式使用; 不需要诊断。 /和/ 每个包含双下划线的标识符 __ 或以下划线开始,然后是用于实施任何使用的资本信函。 /b/ 以下划线开头的每个标识符都保留用于实现用作全局名称空间中的名称。

如果您不小心地遇到了上述限制,则最好不要使用下划线启动符号。

您自己可以理解为什么在开发软件时,这样的下划线可能是灾难性的:

尝试编译一个简单的程序 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是为在类中使用一个或多个虚拟成员函数时自动创建的虚拟表的指针! 但那是另一个故事......

如果使用下划线,您可能会遇到冲突问题,并且您将不知道他们会导致它们直到太晚。

董宝中

赞同来自:

实际上协议
_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- ... tices
骆驼盒具有领先的重点。 在
VB.NET 总是表明 "Protected" 或者
"Private", 不使用 "Dim". 使用
"m_" 不推荐使用
与...不同的变量名称
属性仅用案例,尤其是
受保护的变量,因为它违反了
合规性并使你的生活
如果您编程,疼痛 VB.NET, 像你一样
必须打电话给你的成员
与属性不同的东西
使用权/致毒剂。 of
这里的项目领先的下划线
, 事实上是唯一的争议。
就个人而言,我更喜欢直接
骆驼注册没有下划线的
私有变量所以我没有
需要符合变量名称 "this."
将它们与参数区分开来
设计师或其他地方,我有
, 可能会有名称碰撞。
当不敏感到注册时 VB.NET's 这是
更重要的是,因为你的
访问属性通常具有
与您的私人会员相同
变量,除了下划线。
关于 m_, 然后实际上我们只是说话
关于美学。 一世 /还有许多其他人/
找 m_ ugly, 所以它看起来像
, 变量名中有一个漏洞。 它
几乎令人反感。 我用它
VB6 所有的时间,但它只是
因为变量不可能
初始下划线。 我不能
更快乐,看到他是如何离开的。 Microsoft
建议不要使用 m_ /和
straight _/, 虽然他们做了
两者都在其代码中。 另外,前缀与
直接的 "m"-这是正确的。 当然,
由于它们主要被编码 C#,, 他们能
有闭合的成员
如果它们与属性不同。 人们
必须做别的事情。 反而
为了试图提出来
language-by-language 在特殊情况下,我
我推荐最初的下划线
所有支持它的语言。 如果一个
我完全想要我的课程
Cls兼容,我可以离开
任何受保护的前缀
成员变量 C#. 然而,在实践中,我
永远不要担心,因为我保留了一切
可能受保护的成员变量
私有,而是交付受保护
配件和突变者。 为什么?:
简而言之,这是一项协议
简单的 /一个符号/, 简单可读
/你的观点没有被其他人分散注意力
铅符号/ 成功
避免冲突名称
程序水平的变量和
类级的属性 properties.class-level.

快网

赞同来自:

第一次评论 /R Samayel Klator./ 参考:
https://coderoad.ru/228783/
什么是强调问题的负责 C++. 通常,您不应使用初始下划线,因为它为您的编译器的开发人员保留。 你看到的代码
_var

, 可能是继承的代码,或由使用旧命名系统长大的人编写的代码,这些代码没有在领先的下划线上皱眉。

根据其他答案,他曾经被用过 C++ 识别类成员变量。 但是,它无关紧要任何装饰器或语法。 因此,如果要使用它,它将被编译。

我会讨论 C# 其他。

裸奔

赞同来自:

_var 它只无关紧要,只能使其更容易区分变量是私有成员变量。

在 C++ 使用协议 _var 这是一个糟糕的语气,因为有规则管理在标识符之前使用下划线。 _var 保留为全局标识符 _Var /强调 + 大写字母/ 随时保留。 这就是为什么B. C++ 你会看到使用该协议的人 var_.

君笑尘

赞同来自:

您可以创建自己的编码建议。 只需编写清晰的文档 rest 团队。

使用 _field 帮助 Intelilsense 筛选所有类变量,只需键入 _.

通常我遵循
http://blogs.msdn.com/b/brada/ ... .aspx
但他建议不要使用强调。

莫问

赞同来自:

标准命名 Microsoft 为了 C# 它说变量和参数必须使用骆驼底部寄存器的形式

IE:

paramName

. 该标准还要求字段遵循相同的形式,但它可以导致模糊代码,因此许多团队需要强调的前缀来提高清晰度

IE:

_fieldName

.

涵秋

赞同来自:

从 C#, Microsoft

邀请不要使用下划线

打开

会员。 为了

私人的

使用了下划线成员 OK. 实际上
http://www.wintellect.com/cs/b ... .aspx
/经常在手册中引用/ 用途 m_, 例如,我 A "s_" 私人静态成员。

我个人只使用 _ 参考您的个人成员。 "m_" 和 "s_" 与匈牙利符号的边界,这不仅不赞成 .NET, 但它可以是非常弄脏的,我发现许多成员的课程难以按字母顺序快速扫描眼睛 /想象 10 变量开始 m_/.

石油百科

赞同来自:

我使用命名 _var 对于我的课程的成员变量。 有 2 我这样做的主要原因:

1/ 当我稍后阅读代码时,它可以帮助我跟踪类变量和局部变量。

2/ 它有助于B. Intellisense /或其他代码完成系统/, 当我正在寻找一个类变量。 简单了解第一个符号对于在可用变量和方法列表中过滤。

涵秋

赞同来自:

至于语言 C 和 C++, 然后以名称下划线 /开始,中间或结束/ 没关系。 这只是一个有效的变量名称符号。 "conventions" 它来自编码社区中的编码实践。

如上所述中已经提到的, _ 在开始时,可​​能意味着私有或受保护的类成员 C++.

让我说出一个有趣的故事可以有趣的琐事。 在 UNIX, 如果您有基本的库函数 C 和服务器一部分 kernel, 您希望在哪里提供功能 kernel 还有用户空间, _ 卡在插头函数前面导致函数 kernel 直接,没有做任何其他事情。 最着名和最熟悉的本出口示例// vs. _exit// 在核核中 BSD 和 SysV: 那里 exit// 在调用输出服务之前,请使用用户空间进行工作 kernel, 尽管 _exit 刚刚与退出服务匹配 kernel.

因此, _ 用于 "local" 在这种情况下的事情 local 它是机器本地。 通常 _functions// 没有便携。 在这种情况下,您不应该指望不同平台上的相同行为。

现在担心 _ 在诸如

㈡ _foo;

好吧,从心理学的角度来看, _ - 这是一件奇怪的是,在一开始就打印。 因此,如果要创建一个与别的碰撞概率较小的变量名称, ESPECIALLY 使用预处理器替换时,应考虑使用 _.

我的主要建议是始终遵循编码器社区的约定,以便您可以更有效地合作。

裸奔

赞同来自:

它只是意味着这是一个类成员字段。

卫东

赞同来自:

没有具体的命名协议,但我已经为私人成员看过它。

知食

赞同来自:

从我的经历 /当然,有限/ 下划线将表示这是一个私有成员变量。 随着Gollum所说,它将取决于团队。

诸葛浮云

赞同来自:

许多人喜欢拥有一个重点前缀的个人领域。 这只是一个命名协议。

C#'s 'official' 名称协议在较低寄存器中规定简单名称 /没有强调/ 适用于私人字段。

我不知道标准协议 C++, 虽然强调是非常广泛的。

冰洋

赞同来自:

这只是一些程序员使用何时操作类成员或其他变量时,某些程序员使用。 /参数,函数本地等。/. 另一项协议,也广泛用于成员变量, - 这是一个前缀名称 'm_'.

在任何情况下,这些都只是约定,你不会找到所有的一个来源。 这是一个风格问题,每个程序员,项目或公司都有自己的 /甚至不是/.

董宝中

赞同来自:

https://connect.microsoft.com/ ... in1.0
, 如果代码也必须可扩展 VB.NET.
/否则,我不会。/

只要 VB.NET is 对寄存器质疑的,在此代码中没有简单的方法来访问安全成员
field

:


public class CSharpClass
{
protected int field;
public int Field { get { return field; } }
}


E.g. 这将导致访问该物业。 getter, 而不是现场:


Public Class VBClass
Inherits CSharpClass

Function Test// As Integer
Return Field
End Function

End Class


该死的,我甚至无法写作
field

在小写中 - VS 2010 继续纠正它。

使衍生类可以轻松访问 VB.NET, 你需要拿出另一个命名协议。 下划线的前缀可能是最不侵入性和最重要的 "historically accepted" 他们。

小明明

赞同来自:

现在使用指定 "this", 怎么样 this.foobarbaz, 可应收类成员变量 C#. 他取代了旧的符号 "m_" 或简单 "__". 这使得代码更具可读性,因为毫无疑问是参考。

郭文康

赞同来自:

旧问题,新答案 /C#/.

用于C#的下划线的另一个使用是使用 DI ASP NET Core /注射依赖性/. 私人的
readonly

在构造期间已分配给输入的接口的类变量应以下划线开头。 我假设这是关于是否使用该类私有成员使用下划线的讨论 /虽然萨玛 Microsoft 跟着他/, 但绝对是。


private readonly ILogger<mydependency> _logger;

public MyDependency/ILogger<mydependency> logger/
{
_logger = logger;
}


</mydependency></mydependency>

三叔

赞同来自:

当您阅读代码时,此命名协议很有用,尤其是不是您自己的代码。 严格的命名协议有助于指示定义了特定成员的位置,这是成员等。大多数开发人员团队采取简单的命名协议,只需简单地显示重点的成员字段 /
_fieldName

/. 过去,我使用以下命名协议 C# /这是基于协议 Microsofts 对于框架代码 .NET, 可以使用它 Reflector/:

实例字段:

m_fieldName

静态场:

s_fieldName

Public/Protected/Internal 成员:

PascalCasedName//

私人参与者:

camelCasedName//

它可以帮助人们在阅读不熟悉的代码时非常快速地了解元素的结构,使用,可用性和位置。

要回复问题请先登录注册