21

this//selfme强制显式指针有什么好处

根据OOP理论,方法应该主要(仅?)对成员变量和方法的参数进行操作。在此之后,引用成员变量应该比引用外部(从对象的角度)变量更容易......显式使其this更冗长,因此引用成员变量比引用外部变量更难。这对我来说似乎违反直觉。

4

6 回答 6

22

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

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

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

当快速浏览它时,您必须对前一段中定义的变量有一个心智模型,以了解它是否只是一个临时变量或它是否会改变对象状态。而 this.foo = 42 则很明显对象状态已发生变化。如果专门使用显式取消引用,则可以确保该变量在相反情况下是临时的。

更短的、经过充分考虑的方法使其不那么重要,但在编写代码时,长期的可理解性仍然胜过一点便利。

于 2009-05-26T10:53:26.237 回答
4

如果您在谈论selfPython 意义上的“显式”,这里有一个关于该主题的有趣讨论。这是Guido 对Bruce Eckel 文章的回应。对布鲁斯文章的评论也很有启发性(其中一些,无论如何)。

于 2009-05-26T10:44:08.270 回答
3

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

于 2009-05-26T10:35:40.207 回答
3

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

于 2009-05-26T10:36:52.183 回答
2

我通常仅在编写赋值运算符复制构造函数时才使用它(在 C++ 中),因为它有助于清楚地识别变量。我可以考虑使用它的其他地方是,如果您的函数参数变量名称与您的成员变量名称相同,或者我想使用delete this杀死我的对象。

于 2009-05-26T10:37:05.490 回答
1

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

public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
        {
            this.screenTemplateID = screenTemplateID;
            this.screenTemplateName = screenTemplateName;
            this.isDefault = isDefault;
        }
于 2009-05-26T10:38:16.923 回答