7

自从我发现汽车属性后,我就尝试在任何地方使用它们。在我拥有的每个属性都会有一个私有成员之前,我将在类中使用它。现在它被 auto 属性所取代。我以通常使用普通成员字段的方式在类中使用该属性。问题是该属性以国会大厦开头,这使得以这种方式使用它时看起来有点奇怪。我不介意房产以前以国会大厦开头,因为它们总是在“点”后面。现在,我发现自己在内部使用的所有属性前面都加上了this.,以安抚我的感觉。

我的困境是,在我总是有点反对在所有内部成员的使用前加上前缀this.,除非“必要”(如在 setter 或构造函数中)。因此,我正在寻求对此的第二意见。有没有标准的好方法来做到这一点?我应该停止抱怨吗(我有成为“蚂蚁驼背”(荷兰语表达)的倾向)?

前:

class Foo
{
    private Bar bar;
    public Bar Bar { get { return bar; } }

    public Foo(Bar bar)
    {
        this.bar = bar;
    }

    public void DoStuff()
    {
        if(bar != null)
        {
            bar.DoMethod();
        }
    }
}

后:

class Foo
{
    public Bar Bar {get; private set;}

    public Foo(Bar bar)
    {
        this.Bar = bar;
        // or
        Bar = bar;
    }

    public void DoStuff()
    {
        if(this.Bar != null)
        {
            this.Bar.DoMethod();
        }
        // or
        if(Bar != null)
        {
            Bar.DoMethod();
        }
    }
}

更新

似乎意见不一,尽管更多的人赞成前缀this.. 在 auto 属性之前,我一直非常反对this.在构造函数和 setter 中添加前缀 with 而不是(正如我之前提到的)。但现在我只是不知道了。

附加说明:将属性命名为与类 ( ) 相同的事实也很常见,这public Bar Bar { get; private set; }也使我倾向于使用前缀。每次我输入Bar.DoMethod(),我都觉得它看起来像一个静态方法。即使 VSBar是静态方法,它也会着色,并且您不能拥有具有相同签名的静态方法和实例方法。当它被着色时,很明显它是一个静态方法,但是当它没有着色时,它不是 100% 清楚它不是一个静态方法。例如,您可能只是缺少一个using语句,但也只是因为我不习惯将不着色与它是否是静态调用联系起来。在我通过成员的情况下的第一个字母的大写或在属性的情况下的“点”(例如“点”foo(Foo)foo.Bar.DoMethod())。

(目前很难选择“接受的答案”)

4

4 回答 4

6

是的,有一种“标准方法”:大写字母和 this 前缀被认为是良好的编码习惯。如果您使用一些工具来测试您的代码是否符合ReSharper或 Microsoft 自己的StyleCop等编码指南,如果不使用 this-reference,或者您的属性没有以大写字母开头,它会警告您。

您的属性是公开可见的。任何公共属性、字段或方法都应以大写字母开头。

您在属于该类的自己的类中调用的任何属性、字段或方法都应以 this-reference 作为前缀,以便于阅读。

更新:当然,意见不同。我喜欢点击this.,然后在点之后只看到成员,而不是在没有任何前缀的情况下点击 ctrl-space 时看到所有关键字。这对我有帮助。但是,最后(从这里引用):

无论您有什么看法,重要的是所有在项目上密切合作的人都使用相同的格式标准,而不管这些标准是什么。

更多参考资料: Microsoft在几乎任何名称和属性中
使用大写字母。
更多指南在这里

于 2010-01-18T13:07:12.467 回答
6

我强烈建议使用 ' this. ' 在可能的情况。框架设计指南推荐这种做法。它让您从可读性的角度了解范围,并帮助您避免编译器在编译时可能报告的愚蠢错误。

于 2010-01-18T13:07:42.527 回答
2

我强烈建议不要使用它,因为它只会降低清晰度。如果您确实发现自己处于需要这样做以避免冲突的情况下,我建议您重命名字段/属性/变量之一。

我认为它可以接受的唯一地方是它是否是公开暴露的 API 的一部分,其中重命名会导致重大更改。

于 2010-01-18T13:11:31.050 回答
1

在第一个示例中,bar参数在词法上隐藏bar了实例中的字段。所以你必须使用this消歧。

在第二个示例中,您没有这种歧义,因此不需要消歧(即this)。但是,如果那是您的一杯茶,您仍然可以为其添加前缀。:)

于 2010-01-18T13:07:45.833 回答