私有字段的命名约定

时间:2010-12-27 16:33:47

标签: c# naming-conventions private-members

首先,我知道这个问题之前已被问过几次,最后,这主要是个人偏好的问题,但阅读有关该主题的所有主题,有些事情对我来说并不清楚。

基本上,大多数人都同意的一点是,公共成员应该是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显示两者?

感谢。

4 个答案:

答案 0 :(得分:54)

我非常喜欢私有字段的前导“_”约定,即使它不遵循MS约定:

  1. 它消除了与camel cased参数名称的冲突 - 无需使用“this”

  2. 这是一个可视指示器,表示正在读取对象的内部持久状态,或者 - 更重要的是 - 正在写入。这是一个标语,说“”这个副作用超出了我碰巧看到的特定方法“,这在查看不熟悉的代码时非常重要。

答案 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规则,因为它不是匈牙利符号。