在Java中,为什么人们用`this`前置字段?

在引用类变量时,为什么人们会在它前面添加它? 我不是在谈论this用来消除方法参数歧义的情况,而是在它看起来没必要时。

例:

 public class Person { private String name; public String toString() { return this.name; } } 

toString ,为什么不引用name作为name

 return name; 

this.name买什么?

这是一个stackoverflow问题,其代码具有this预先挂起。

同样的原因,有些人喜欢用“m_”或名称接口“IFoo”来预置私有数据成员。 他们相信它提高了可读性和清晰度。 您是否同意这些惯例是一个品味问题。

  1. 防御性编程(如果有人编辑代码,以后会添加一个参数或带有冲突名称的本地
  2. 使代码“自我记录”更加明显

有时需要消除歧义:

 public void setFoo(Bar foo) { this.foo = foo; } 

在其他时候,这只是一种风格。 总的来说,我试图尽可能地避免this.blah 。因为它更加冗长。 如果您想知道,结果字节码完全相同。

它在语言层面没有任何作用。 但它确实可以立即指示某人阅读有关变量范围的代码,从而提高对代码的理解。

我经常看到人们这样做是因为它触发了智能感知。 我个人更喜欢放弃“这个”。 因为它创造了更多没有任何价值的代码。

在.NET世界中,Microsoft StyleCop工具还有一个名为“Prefix Local Calls With This”的规则:

只要代码包含对本地类的实例成员的调用或没有以“this”为前缀的基类,就会发生违反此规则的情况。 当存在基类成员的本地覆盖时,会发生此规则的例外,并且代码打算直接调用基类成员,绕过本地覆盖。 在这种情况下,呼叫可以以“base”为前缀。 而不是’这个’。

默认情况下,StyleCop不允许使用下划线或m_来标记本地类字段,而是支持’this’。 字首。 使用’this’的优势。 它同样适用于所有元素类型,包括方法,属性等,而不仅仅是字段,使得对类成员的所有调用都可以立即识别,无论使用哪个编辑器来查看代码。 另一个优点是它在实例成员和静态成员之间创建了一个快速,可识别的区别,这些区分不是前缀。

使用’this’的最后一个好处。 输入前缀就是这个。 将导致Visual Studio显示IntelliSense弹出窗口,使开发人员可以快速轻松地选择要调用的类成员。

我的建议是选择一个约定(使用此或不使用)并坚持使用。

它可以帮助您一目了然地识别成员变量。
上面的ToString()太小了,无法说明这一点。
假设你有一个屏幕大小的方法。 您计算,分配,交换本地和实例变量的混合。 this.memberVarthis.memberVar可帮助您通过字段分配或属性设置器跟踪修改实例状态的位置。

稍微一点,但值得注意的是,Eclipse中的“清理”工具可以设置为自动添加/删除它。 成员访问根据喜好。

首选项对话框中的“Java /代码样式/清理”。

除了使用方法参数消除歧义之外,它什么都不买。 也许清晰度/可读性,但这取决于你的风格。

如果你在属性名称之前加入这个,我认为没有错。 如果您具有相同名称的任何声明(这可能在初始化属性时在构造函数中发生),这有助于消除属性与局部变量的歧义。

它不会影响性能,它不会产生任何可读性问题(如果它可以使阅读更容易)。

所以我认为我们不必担心这一点。 让程序员自己做出选择。

我使用它的唯一地方是类中的构造函数,其中类的一些/大多数字段可以由构造函数提供。 我使用它而不是使用短名称作为方法签名,它似乎比缩写更加一致。

例如,在“Rational”类中

而不是做

 class Rational { int denominator; int numerator; public Rational(int d, int n) { denominator = d; numerator = n; } } 

我这样做

 class Rational { int denominator; int numerator; public Rational(int denominator, int numerator) { this.denominator = denominator; this.numerator = numerator; } } 

这样调用者就可以更多地了解构造函数参数的用途。

他们可能是一名Python程序员,如果没有明确的话,就会遭受折磨/迷失/困惑。

要记住的其他事情是语言本身。 你没有特别提到Java(虽然我假设你并没有真正想到任何其他东西,所以这个评论更加真实),但正如之前的海报已经提到的那样,这是一个很好的方法来使代码自我当其他人开始修改您的代码库时,记录以防止混乱。

但是,如果使用PHP,则在引用类变量时通常需要使用$this 。 由于语言之间存在不同的规则,因此通常最容易使用它们之间常见的模式,这种模式恰好是一种非常可靠的编码风格。 我更容易this简单地添加到所有内容中,而不是试图记住语言需要什么语言以及什么语言只是“更喜欢”它。

“this”可防止与父类/ es中具有相同名称的实例变量混淆。

它几乎是前置“超级”的补充。

我在编写大块代码时尝试使用’this.whatever’,因为更容易弄清楚引用的是什么。 当阅读其他人编写的大块代码时,在某些时候我常常会对它们是引用实例变量还是局部变量感到困惑。

代码更简单。 在我看来,另一个好的做法是调用toString()getXXX() (而不是this.XXX ),因为getXXX()可以有一个重要的逻辑。

我认为在没有这个的情况下使用属性名称对于维护应用程序来说不是一个好主意。