始终使用this-keyword作为前缀(自动)属性是一种好习惯吗?

时间:2010-01-18 13:01:27

标签: c# this prefix automatic-properties

自从我发现汽车属性以来,我试着到处使用它们。以前我会在课堂上使用的每个属性都会有一个私人成员。现在这被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.添加前缀。在自动属性之前,我总是反对用this.作为前缀,而不是在构造函数和setter中(如前所述)。但现在我不知道了。

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

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

4 个答案:

答案 0 :(得分:6)

是的,有一种“标准方法”:大写字母和这个前缀被认为是良好的编码习惯。如果您使用某种工具来测试代码以获取ReSharper或Microsoft自己的StyleCop等编码指南,则会在不使用this-reference时向您发出警告,或者如果您没有使用资本。

您的属性是公开可见的。任何公共财产,领域或方法都应以资本开头。

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

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

  

无论您的意见如何,重要的是   事情是所有人都密切关注   在项目上合作使用   相同的格式标准,   不管那些标准是什么   是

更多参考文献:
Microsoft on using a capital letter几乎任何名称和财产中都有。{ 更多guidelines here

答案 1 :(得分:6)

我强烈建议尽可能使用' this。'。 Framework Design Guidelines 推荐这种做法。它让您从可读性的角度了解范围,并帮助您避免编译器在编译时报告的愚蠢错误。

答案 2 :(得分:2)

我强烈建议使用 never ,因为它只会降低清晰度。如果您确实发现自己处于需要避免冲突的实例中,我建议您重命名其中一个字段/属性/变量。

我觉得唯一可以接受的地方是,它是公开暴露的API的一部分,重命名会导致重大变化。

答案 3 :(得分:1)

在第一个示例中,来自实例的bar参数词法阴影bar字段。因此,您必须使用this来消除歧义。

在第二个例子中,你没有这种歧义,因此不需要消除歧义(即this)。然而,如果那是你的一杯茶,你仍然可以作为前缀。 :)