26

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

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

谢谢。

4

4 回答 4

59

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

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

  2. 它是对象的内部持久状态正在被读取,或者——更重要的是——被写入的视觉指示器。这是一个标志,上面写着“这在我碰巧正在查看的特定方法之外有副作用”,在查看不熟悉的代码时了解这一点非常重要。

于 2012-07-12T21:48:30.547 回答
16

你说的很对。它没有。

Usingthis是一种确保您使用类成员的方法,以防命名冲突(比如参数名称与字段名称相同)。

对我来说,帕斯卡套管公共成员和骆驼套管私人成员一直足以很好地运作。

于 2010-12-27T16:37:12.040 回答
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.前缀 - 而不仅仅是在需要时 - 个人喜好,真的......

于 2010-12-27T16:38:10.583 回答
7

使用下划线前缀私有字段与使用“this.”基本相同。然而,下划线对我来说使用起来更快、更短、更优雅(我相信这来自 Java)。

对函数参数和私有字段使用相同的名称对我来说似乎有点棘手。我不仅有一次忘记使用“this”,这导致了讨厌的 NullPointerException(是的,我有一天做了 java ... :))。

据我所知,它不违反任何 FxCop 规则,因为它不是匈牙利符号。

于 2011-01-02T11:05:49.710 回答