私有字段的命名约定
Posted
技术标签:
【中文标题】私有字段的命名约定【英文标题】:Naming convention for private fields 【发布时间】:2010-12-27 16:33:46 【问题描述】:首先,我知道这个问题之前已经被问过好几次了,最后,这主要是个人喜好问题,但是阅读所有关于该主题的线程,有些事情我并不清楚。
基本上,大多数人至少同意的一点是公共成员应该是 PascalCased,而私有成员应该是 lowerCamelCased。
通常引起争论的问题是是否在私有成员前面加上下划线或其他任何东西。前缀违反了几个 StyleCop 规则(但显然可以关闭)
不加前缀的理由是你应该使用它。改为前缀。
我的问题是我不明白它是如何产生影响的? 我的意思是,这并不是说你不能在类中的公共成员上使用它。
让我们想象一个类 Customer,看起来像这样:
class Customer
private int age;
public int Age
get return this.age;
set this.age = value;
(显然,在这种简单的情况下,我可以使用自动属性,但这只是一个示例)。
如果我在这个类中添加第二个属性,没有什么会阻止我使用 this.Age(公共属性)而不是 this.age(私有字段)来引用它。 有时,如果在 getter 级别应用了某些验证或格式化,它甚至是可取的。
另外,如果我的类的一些其他属性需要修改客户的年龄,那么直接使用属性而不是支持字段是有意义的,因为 setter 也可以实现一些业务规则验证,对吧?
换句话说,我真的不明白 this 关键字如何避免私有支持成员和公共属性之间的混淆,因为它可以在两者上使用并且 IntelliSense 显示两者?
谢谢。
【问题讨论】:
【参考方案1】:我非常喜欢私有字段的前导“_”约定,即使它不遵循 MS 约定:
它消除了与驼峰式参数名称的冲突 - 无需使用“this”
这是一个视觉指示器,表明对象的内部持久状态正在被读取,或者更重要的是正在被写入。这是一个标志,上面写着“这在我碰巧正在查看的特定方法之外有副作用”,在查看不熟悉的代码时了解这一点非常重要。
【讨论】:
我试图了解下划线的优点,但我可以简单地说:使用'this.':1.它消除了对“_”的需要。 2. 这是一个视觉指标,表明对象的内部持久状态......你明白我的意思。你的论点是双向的。 确实如此。我更喜欢 _ 而不是“this”的更多原因——它更紧凑,而且不是可选的——如果你忘记了变量引用中的 _,程序将无法编译。但我认为这主要是个人喜好...... 广告2:这不是语法高亮应该做的吗? 其实如果你查看.Net Core
的源码,你会发现他们使用_xyz
约定的地方很多。
@MohammedNoureldin 还有其他一些情况,他们使用m_xyz
。【参考方案2】:
你说的很对。没有。
使用this
是一种确保您使用类成员的方法,以防出现命名冲突(比如参数名称与字段名称相同)。
对我来说,pascal 套管公共成员和骆驼套管私有成员一直是足够好的约定。
【讨论】:
【参考方案3】:使用this.age
可以帮助区分Age
属性的后备存储和对象方法的age
参数:
public bool CheckIfOlderThan(int age)
// in here, just using "age" isn't clear - is it the method parameter?
// The internal field?? Using this.age make that clear!
return (this.age >= age);
当然,在这种情况下,你也可以给你的参数一个不那么容易混淆的名字,以避免任何冲突......
但是在属性的实际定义中——在后备存储中读取和存储它的值——添加this.
并没有真正添加任何东西。我认识的一些人只是喜欢一直使用this.
前缀——不仅仅是在需要的时候——个人喜好,真的......
【讨论】:
【参考方案4】:使用下划线前缀私有字段与使用“this.”基本相同。然而,下划线对我来说使用起来更快、更短、更优雅(我相信这来自 Java)。
对函数参数和私有字段使用相同的名称对我来说似乎有点棘手。我不仅有一次忘记使用“this”,这导致了讨厌的 NullPointerException(是的,我有一天做了 java...:))。
据我所知,它没有违反任何 FxCop 规则,因为它不是匈牙利符号。
【讨论】:
它绝对不是来自Java。在 C/C++ 中,以下划线开头的标识符通常是为编译器保留的。以上是关于私有字段的命名约定的主要内容,如果未能解决你的问题,请参考以下文章
大厂通用的MySQL开发规范设计,包括“存储引擎字符集 命名规则等公共约定”,“表设计约定”,“字段设计约定”,“索引设计约定”,“SQL约定”,“开发人员行为约定”