关于语言不可知论:使用this/self指针强制显式有什么好处?

What is the advantage of having this/self pointer mandatory explicit?

使用this/self/me指针强制显式有什么好处?

根据OOP理论,一种方法应该主要(仅是?)关于成员变量和方法参数。接下来,引用成员变量应该比引用外部变量(从对象的角度)更容易…显式this使其更加冗长,因此引用成员变量比引用外部变量更困难。这对我来说似乎是违反直觉的。


除了成员变量和方法参数,您还拥有局部变量。关于对象最重要的事情之一就是它的内部状态。显式成员变量取消引用使您可以非常清楚地看到在哪里引用该状态以及在哪里修改该状态。

例如,如果您有如下代码:

1
2
3
4
5
someMethod(some, parameters) {
    ... a segment of code
    foo = 42;
    ... another segment of code
}

当快速浏览它时,您必须有一个在前面部分中定义的变量的心理模型,以知道它是一个临时变量还是改变了对象的状态。而this.foo=42则表明对象状态发生了变化。如果只使用显式取消引用,则可以确保变量在相反的情况下是临时的。

较短的、经过充分考虑的方法使它变得不那么重要,但是,长期的可理解性在编写代码时胜过了一点便利性。


如果您在谈论"显式的self"(从python的意义上来说),这里有一个关于这个主题的有趣讨论。这是基多对布鲁斯·埃克尔的文章的回应。对布鲁斯文章的评论也很有启发性(不管怎么说,有些评论是有启发性的)。


您需要它将指针/引用传递到其他地方的当前对象,或者在赋值运算符中防止自赋值。


如果一个方法的参数与成员变量同名怎么办?然后您可以使用this.x = x。其中,this.x是成员变量,x是方法参数。这只是一个(微不足道的)例子。


我通常只在编写赋值操作符或复制构造函数时使用这个(C++),因为它有助于清楚地识别变量。我可以考虑使用它的另一个地方是,如果函数参数变量名与成员变量名相同,或者我想使用delete this来杀死我的对象。


例如,成员名称与传递给方法的名称相同

1
2
3
4
5
6
public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
        {
            this.screenTemplateID = screenTemplateID;
            this.screenTemplateName = screenTemplateName;
            this.isDefault = isDefault;
        }