什么是拥有this
/self
/me
指针的强制性显式声明的优势?
根据OOP理论,方法主要(只?)操作成员变量和方法参数。因此,应该更容易引用成员变量而不是外部变量(从对象的角度来看)。显式的this
使得它更冗长,因此引用成员变量比引用外部变量更加困难。这对我来说似乎是违反直觉的。
什么是拥有this
/self
/me
指针的强制性显式声明的优势?
根据OOP理论,方法主要(只?)操作成员变量和方法参数。因此,应该更容易引用成员变量而不是外部变量(从对象的角度来看)。显式的this
使得它更冗长,因此引用成员变量比引用外部变量更加困难。这对我来说似乎是违反直觉的。
除成员变量和方法参数外,您还有本地变量。对象中最重要的事情之一是其内部状态。明确成员变量取消引用使得您非常清楚地知道在哪里引用该状态以及在哪里修改该状态。
例如,如果您的代码如下:
someMethod(some, parameters) {
... a segment of code
foo = 42;
... another segment of code
}
快速浏览代码时,你需要在脑海中建立起定义于前面代码段中的变量的模型,才能知道它是一个临时变量还是会改变对象状态的变量。而像 this.foo = 42 这样显式地修改了对象状态则更加明显。如果仅使用显式解引用,那么可以确定该变量为临时变量。
虽然对于短小且良好分解的方法来说这个问题没那么重要,但长期的可读性胜过编码时的一点便利。
this.x = x
。其中this.x
是成员变量,x
是方法参数。这只是一个(微不足道的)例子。您需要将指针/引用传递到其他地方或在赋值运算符中保护自身免受自我赋值的影响。
我通常只在编写赋值运算符或复制构造函数时使用它(在C++中),因为它有助于清楚地识别变量。我能想到的另一个使用场合是,如果您的函数参数变量名与成员变量名相同,或者我想使用delete this来销毁对象。
delete this
很不对吗? - Robert S. Barnes例如,成员名称与传递给方法的名称相同。
public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
{
this.screenTemplateID = screenTemplateID;
this.screenTemplateName = screenTemplateName;
this.isDefault = isDefault;
}