这/self指针强制显式的优势是什么?

23

什么是拥有this/self/me指针的强制性显式声明的优势?

根据OOP理论,方法主要(只?)操作成员变量和方法参数。因此,应该更容易引用成员变量而不是外部变量(从对象的角度来看)。显式的this使得它更冗长,因此引用成员变量比引用外部变量更加困难。这对我来说似乎是违反直觉的。

5个回答

25

除成员变量和方法参数外,您还有本地变量。对象中最重要的事情之一是其内部状态。明确成员变量取消引用使得您非常清楚地知道在哪里引用该状态以及在哪里修改该状态。

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

someMethod(some, parameters) {
    ... a segment of code
    foo = 42;
    ... another segment of code
}

快速浏览代码时,你需要在脑海中建立起定义于前面代码段中的变量的模型,才能知道它是一个临时变量还是会改变对象状态的变量。而像 this.foo = 42 这样显式地修改了对象状态则更加明显。如果仅使用显式解引用,那么可以确定该变量为临时变量。

虽然对于短小且良好分解的方法来说这个问题没那么重要,但长期的可读性胜过编码时的一点便利。


当作用域问题出现时(本地作用域的 foo 将隐藏类成员变量 foo),这是有用的,但考虑到 OP 在其他地方的评论,这并非绝对必要,只是方便而已。 - Robert Paulson
我还需要一个“心理模型”来知道自己是在“if”还是“while”中;为什么不用这些信息作为所有这类指令的前缀呢? - einpoklum
@RobertPaulson: 通过要求明确地阴影化来自某些外部范围的变量,可以解决这个问题。 - einpoklum
这非常有用。但它应该是可选的。我来自一个关于 Python 中强制使用 "self." 作用域修饰符的讨论。过度使用这样的修饰符,如在 Python 中看到的那样,会使代码混乱,并降低整体可读性。 - MickeyDickey

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

1
我添加了“必填”的词语,因为这是我所询问的内容。 - Piotr Dobrogost

3

您需要将指针/引用传递到其他地方或在赋值运算符中保护自身免受自我赋值的影响。


我添加了“必填”的词语,因为这是我所询问的内容。 - Piotr Dobrogost

2

我通常只在编写赋值运算符复制构造函数时使用它(在C++中),因为它有助于清楚地识别变量。我能想到的另一个使用场合是,如果您的函数参数变量名与成员变量名相同,或者我想使用delete this来销毁对象。


是我一个人觉得调用delete this很不对吗? - Robert S. Barnes
通常来说这是一个不好的想法,但在某些情况下,比如引用计数对象,你可能想这么做。 - Naveen
如果你希望"递减计数器,检查值并在需要时删除"这个动作成为一个单一的方法,对于引用计数对象来说,你别无选择。 - sharptooth
引用计数对象不应该删除自身,而应该删除它所引用的对象。 - anon

1

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

public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
        {
            this.screenTemplateID = screenTemplateID;
            this.screenTemplateName = screenTemplateName;
            this.isDefault = isDefault;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接