首先,我知道这个问题之前已被问过几次,最后,这主要是个人偏好的问题,但阅读有关该主题的所有主题,有些事情对我来说并不清楚。
基本上,大多数人都同意的一点是,公共成员应该是PascalCased而私人成员应该是低级的。
通常引发争论的问题是,是否用私人成员或其他任何东西作为私人成员的前缀。前缀违反了几个StyleCop规则(显然可以关闭)
不加前缀的基本原理是你应该使用它。改为加前缀。
我遇到的问题是我不明白它是如何产生影响的? 我的意思是,并不是说你不能在一个班级内的公共成员身上使用它。
让我们设想一个类Customer,看起来像这样:
class Customer
{
private int age;
public int Age
{
get { return this.age; }
set { this.age = value; }
}
}
(显然,在这么简单的情况下,我可以使用autoproperty,但这只是一个例子)。
如果我在这个类中添加了第二个属性,那么没有什么能阻止我使用this.Age(公共属性)而不是this.age(私有字段)来引用它。 有时候,如果在getter级别应用了一些验证或格式化,它甚至可以被发现。
此外,如果我班级的其他一些属性需要修改客户的年龄,那么直接使用属性而不是支持字段是有意义的,因为setter也可以实现一些业务规则验证,对吗?
换句话说,我真的没有看到this关键字如何避免私有支持成员和公共属性之间的混淆,因为这可以在两者上使用并且IntelliSense显示两者?
感谢。
答案 0 :(得分:54)
我非常喜欢私有字段的前导“_”约定,即使它不遵循MS约定:
它消除了与camel cased参数名称的冲突 - 无需使用“this”
这是一个可视指示器,表示正在读取对象的内部持久状态,或者 - 更重要的是 - 正在写入。这是一个标语,说“”这个副作用超出了我碰巧看到的特定方法“,这在查看不熟悉的代码时非常重要。
答案 1 :(得分:14)
你是对的。它没有。
使用this
是一种确保使用类成员的方法,以防命名冲突(例如,参数名称与字段名称相同)。
对我来说,pascal外壳公共成员和骆驼外壳私人成员一直都是一个很好的惯例。
答案 2 :(得分:8)
使用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.
前缀 - 而不仅仅是在需要的时候 - 个人偏好,真的......
答案 3 :(得分:7)
使用下划线前缀私有字段与使用“this”基本相同。然而,下划线使用起来更快,更短,更优雅(这来自Java,我相信)。
对于函数参数和私有字段具有相同的名称对我来说似乎有点棘手。不仅一次我忘了使用“这个”导致令人讨厌的NullPointerException(是的,我有一天做了java ... :))。
据我所知,它并没有违反任何FxCop规则,因为它不是匈牙利符号。