始终使用 this 关键字为(自动)属性添加前缀是不是被认为是一种好习惯?

Posted

技术标签:

【中文标题】始终使用 this 关键字为(自动)属性添加前缀是不是被认为是一种好习惯?【英文标题】:Is always prefixing (auto)properties with the this-keyword considered a good practice?始终使用 this 关键字为(自动)属性添加前缀是否被认为是一种好习惯? 【发布时间】:2010-01-18 13:01:27 【问题描述】:

自从我发现自动属性后,我就尝试在任何地方使用它们。在我拥有的每个属性都会有一个私有成员之前,我将在类中使用它。现在这被 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 中(正如我之前提到的)。但现在我只是不知道了。

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

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

【问题讨论】:

有趣,你如何设法给一个属性与类同名?这是非法语法,编译时会抛出“成员名称不能与其封闭类型相同”错误。 @Abel,不,它没有:) *** 将第二个 Bar 着色错误,但 VS 接受它。我已经阅读了一堆关于这是否是好的做法的问题,我从中得出的结论是。 ***.com/questions/525319/…***.com/questions/1095644/…***.com/questions/2023993/… 我看到了问题。当我将属性命名为Foo 时,就会出现该错误。 Foo 是封闭类型而不是 Bar 啊:你的意思是使用返回类型的类型名作为属性的名称,不一定是封闭类型。是的,当然没问题。 感谢标题编辑,我在用一句话表述问题时遇到了一点问题,但它没有成为适合“零标点”一集的句子 【参考方案1】:

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

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

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

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

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

更多参考:Microsoft on using a capital letter 几乎可以使用任何名称和属性。 更多guidelines here.

【讨论】:

嘿,有趣。 DevExpress CodeRush 正好相反——它会警告你“this”的不必要使用。虽然我忽略了它并使用它 - 我也喜欢这个指南。 据我所知,R# 默认情况下与 DevExpress 相同。惹恼了我,所以我可能不得不切换它;-) 感谢您的回答。我觉得这个是最全的。我已经被说服使用this. :) @Erik 和其他人:如果您想确保遵循 MS 的编码指南,可以使用 StyleCop For Resharper,其中包括 this-enforcing-rule:codeplex.com/StyleCopForReSharper【参考方案2】:

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

【讨论】:

我个人讨厌有人使用不必要的消歧前缀。 就我个人而言,我也讨厌它,但是一旦我习惯了它,它就不能作为“前缀”了,它可以作为指导:它使代码更具可读性。而且它比像psz_ 等旧式匈牙利符号前缀更不做作。 @abel:我同意,那些更糟糕:) 我看到了使用它们的一个主要优势:如果您稍后引入同名的局部变量,您将不会破坏您的代码。 ;) 你能指出这个建议在书中的哪个位置吗?据我所见(我有第一版,在纸上),附录 A(讨论编码约定而不是公共界面设计的部分)在 this 上没有任何内容【参考方案3】:

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

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

【讨论】:

从公共 API 的角度来看,它如何导致重大更改? 前缀的好处是,如果你以后引入同名的参数/局部变量,你不会破坏你的代码。而且它永远不会降低清晰度或可读性。 :) @Lepidus 如果您已经有一个与参数同名的公共字段/属性。 @Vilx 我不同意,在您的代码中使用毫无意义的词无济于事。这就像在一个 for 循环上方添加一个注释,上面写着 //for 循环,如果你在需要它时实际使用它,即使它使编译器明确它仍然非常模糊。 @Chris,您是否也建议不要使用“this”作为前缀。在“之前”代码中 Foo 的构造函数的情况下(例如,通过重命名变量之一)? +1 表示反对意见,-1 因为我强烈不同意“它会降低清晰度”。我发现自己经常按 F12 或滚动查找某个属性或方法的声明位置。使用this. 可以非常清楚地表明意图是什么,并为我节省了很多查找时间。它不会降低清晰度(除非您不一致地使用它),它会提高清晰度。 StyleCop 要求它,微软要求它(内部),我认为是有原因的:social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/…【参考方案4】:

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

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

【讨论】:

前缀的好处是,如果你以后引入同名的参数/局部变量,你不会破坏你的代码。 @leppie,嗯,我知道这意味着什么以及它的作用。我的问题是我的茶已经凉了,我需要一个新的。但我觉得很难选择。所以我想知道一个杯子是否比其他杯子更值得推荐。 @Matthijs:我不推荐它。为什么你会做一些不必要的事情并在你的代码中增加冗长,并使它可能更难阅读?

以上是关于始终使用 this 关键字为(自动)属性添加前缀是不是被认为是一种好习惯?的主要内容,如果未能解决你的问题,请参考以下文章

关于JS中的this关键字

如何自动将浏览器前缀添加到 CSS3 属性?

私用成员の纠结

如何使用 XSLT 为所有元素和属性添加名称空间和前缀?

使用原始表名称为 left_join() 生成的所有列添加前缀

this的分析