题
VB.NET 中是否有命名私有字段的官方约定?例如,如果我有一个名为“Foo”的属性,我通常将私有字段称为“_Foo”。这在国内似乎是不被允许的 官方指南:
“不要对字段名称使用前缀。例如,不要使用 g_ 或 s_ 来区分静态字段和非静态字段。”
在 C# 中,您可以调用私有字段“foo”、属性“Foo”,并在构造函数中将私有字段引用为“this.foo”。由于 VB.NET 不区分大小写,因此您无法执行此操作 - 有什么建议吗?
解决方案
我仍然在 VB 中对私有字段使用 _ 前缀,因此我将 _foo 作为私有字段,将 Foo 作为属性。我也为 C# 以及我编写的几乎所有代码执行此操作。一般来说,我不会太纠结于“什么是正确的方法”,因为并没有真正的“正确”的方法(尽管有一些非常糟糕的方法),而是关心始终如一地这样做。
最终,保持一致将使您的代码比使用任何一组“正确”约定更具可读性和可维护性。
其他提示
这是个人喜好,尽管人们普遍支持拥有 一些 区别。即使在 C# 中,我也不认为存在一种广泛使用的约定。
杰夫·普罗西斯 说
根据个人喜好,我通常在私有字段前添加下划线 [在 C# 中] ...此约定在 .NET 框架中使用较多,但并未在整个框架中使用。
来自 。NET 框架设计指南 第二版第 73 页。
杰弗里·里克特 说
我将所有字段设为私有,并在实例字段前加上“m_”前缀,在静态字段前加上“s_”[在 C# 中]
来自 。NET 框架设计指南 第二版第 47 页。安东尼·摩尔(首创团队)还认为使用“m_”和“s_”值得考虑,第 48 页。
官方指导方针就是这样——指导方针。你可以随时绕过他们。话虽如此,我们通常在字段中添加下划线前缀 两个都 C# 和 VB.NET。这种约定很常见(显然,官方指南被忽略了)。
然后可以在不使用“me”关键字的情况下引用私有字段(“this”关键字用于 C# :)
您链接的设计指南明确指出它们仅适用于静态公共和受保护字段。设计指南主要关注公共API的设计;您对私人成员的处理方式取决于您。我并不乐观,但我相对有信心,当编译器检查 CLS 合规性时,不会考虑私有成员,因为只有公共/受保护的成员才会在那里发挥作用(想法是,“如果有人使用以下语言怎么办?不允许 _ 字符尝试使用您的库?”如果成员是私有的,答案是“什么都没有,用户不必使用这些成员。”但如果成员是公共的,你就有麻烦了。 )
也就是说,我要补充一点,并指出无论你做什么,保持一致很重要。我的雇主要求 C# 和 VB 中的私有字段都以 _ 为前缀,并且因为我们所有人都遵循此约定,所以很容易使用其他人编写的代码。
在 VB.NET 4.0 中,大多数人可能知道不需要为 Property 声明显式编写 getter 和 setter,如下所示:
Public Property Foo As String
Public Property Foo2 As String
VB 自动创建名为 _Foo 和 _Foo2 的私有成员变量。微软和 VS 团队似乎已经采用了 _ 约定,所以我不认为它有问题。
我不认为有正式的命名约定,但我看到 Microsoft 在 Microsoft.VisualBasic dll 中使用 m_ (通过反射器)。
我仍然将VB中的_前缀用于私有字段,因此我将_foo作为私有字段,而将foo作为属性。我也为C#做到这一点,几乎是我编写的任何代码。通常,我不会太过陷入“正确的方法”之中,因为没有真正的“正确”方式(尽管有一些非常糟糕的方式),而是关心这样做。
我还没有找到比“_”更好的澄清和一致性。缺点包括:
- 不符合 CLS
- 当 VB 在我的 IDE 上绘制水平线时往往会迷失方向
我通过在编辑器中关闭这些行来绕过这些行,并尽量不要过多考虑 CLS 合规性。
我同意@lomaxx,整个团队保持一致比拥有 正确的 习俗。
不过,这里有几个获得编码约定想法和指导的好地方:
- Microsoft Visual Basic 和 Visual C# 实用指南和最佳实践 Francesco Balena 的《开发人员》是一本很棒的书,解决了其中的许多问题。
- IDesign 编码标准 (对于 C# 和 WCF)
- .NET框架 源代码 (在VS2008中)
我更喜欢对私有字段使用下划线前缀。我使用小写的第一个字母作为方法参数。我遵循为方法使用小写驼峰式参数的准则,我认为这比私有字段的命名更重要,因为它是类 API 的一部分。。例如
Public Class Class1
Private _foo As String
Public Property Foo() As String
Get
Return _foo
End Get
Set(ByVal value As String)
_foo = value
End Set
End Property
Public Sub New(ByVal foo As String)
_foo = foo
End Sub
End Class
使用此模式,您将不会与 C# 或 VB.NET 中的私有字段和构造函数参数发生任何命名冲突。
我同意最重要的不是一个人使用什么风格,而是它的一致性。
话虽如此,私有字段的新 MS/.NET 样式往往是 _fooVar(下划线后跟驼峰命名)