使用“this”(“Self”,“Me”等)有没有任何不适用的原因?(涉及IT技术)

10

我读了这篇回答以及它的评论,我很好奇:不使用this / Self / Me 的原因是什么?

顺便说一句:如果之前有人问过这个问题,我很抱歉,似乎在SO上无法搜索this这个词。

15个回答

9

警告:以下纯属主观见解。

我认为不使用this/self/me的最好“理由”是简洁性。如果它已经是成员变量/函数,那么为什么要冗余地添加前缀呢?

个人而言,除非需要消除编译器中特定表达式的歧义,否则我避免使用this/self/me。许多人对此持不同意见,但我在任何工作组中都没有真正遇到过这个棘手问题。


主观评论:使用这个理由,你也会在代码中删除换行符吗?你应该首先编写易于人类阅读的代码,其次才是机器可读性。 - Torbjørn
@Torbjørn:如果他觉得省略this/self/me更易读,那怎么办? - Firas Assaad
我认为这种写法更加易读。我会在成员变量前加上m_/_前缀,而且我发现阅读this.m_foo并不比m_foo更容易理解。m_表示成员变量,所以为什么要增加额外的负担呢? - JaredPar
那就很好了。不过我理解他的回答不是这样的。 - Torbjørn
不要误解我,我几乎从不使用“this”,但是如果有政策禁止我使用它,我会反对! - Torbjørn
显示剩余3条评论

8

我认为在已经引用的两篇文章中,涵盖了大多数常见场景;主要是简洁和冗余与清晰度之间的平衡 - 还有一个小细节:在C#中,必须使用"this"才能访问当前类型的"扩展方法" - 也就是说

this.Foo();

其中 Foo() 是在外部声明的:

public static void Foo(this SomeType obj) {...}

5

有些情况下需要进行澄清,比如在c#中的这个例子:

public class SomeClass
{
    private string stringvar = "";

    public SomeClass(string stringvar)
    {
        this.stringvar = stringvar;
    }
}

但这不是使用它的理由吗?(而不是不使用它的理由?) - Daniel Rikowski
2
这会是一个重命名参数的理由 ;) - boutta
我同意,参数应该被重新命名 :) 但它仍然显示了这样的内容。有助于理解它是类的私有变量而不是参数被引用。@daniel: 是的,那就是我的观点。在这个例子中使用this是很有道理的。 - sindre j
如果你不使用它,编译器就不会知道你正在引用成员变量。使用 this. 是为了告诉编译器你需要访问一个成员变量 - 这个成员变量超出了方法的直接范围。 - James Camfield

3
如果您使用所有规则的StyleCop,它会要求您添加this.。自从我开始使用它后,我发现我的代码更易读,但这是个人偏好。

2

我认为这不是问题,因为它只会增加代码的可读性,这是一件好事。

对于一些语言,比如PHP,如果你需要使用类字段或方法,则必须以$this->为前缀。

我不喜欢这个事实,因为它使某些行比它们本来可以的更长,如果PHP有一种不需要它来引用类成员的方法,那就更好了。


2
我个人认为this.whatever不够易读。在一个类中到处都是this.variablethis.othervariable时,您可能不会注意到两行方法的区别。

此外,我认为使用this.是作为深受憎恶的匈牙利符号的替代品之一。有些人发现,让读者看到变量是类成员仍然更清晰,并且this.可以解决这个问题。但是,如果我们需要额外的清晰度,为什么要欺骗自己而不使用纯老式的"m_"或简单的"_"? 5个字符与2个(甚至1个)相比,输入更少,结果相同。
话虽如此,样式的选择仍然是个人偏好的问题。很难说服习惯于以某种方式阅读代码的人改变它。

我会把 "m_" 算作 5 次手指动作 :)
  1. 'm'
  2. <shift>
  3. '_'
  4. 左手指回到主键盘
  5. 右手指回到主键盘
我甚至可能会发现自己打 "this." 比 "m_" 更快。 :D而且它有一个优点,可以在除了 Visual Studio 之外的 IDE 中调用智能感知功能。
- Hosam Aly
你关于手指动作的看法是正确的。我个人更喜欢使用简单的“_”,因为它更短。顺便说一下:我记得在早期的C++时代有一个很好的Visual Assist功能 - 输入“m”然后按“shift”会自动插入“m_”。 - Dan C.

2

在Eclipse中,它会用不同的颜色来区分字段、参数和局部变量,因此至少在Eclipse环境下,没有必要在语法上区分字段以将它们特别标记为“字段”,以便自己和后代更好地理解。


1

这个问题之前确实被问过,在“Java变量”背景下:

您是否在Java中使用“this”前缀实例变量?

主要的经常出现的原因似乎是:

“它增加了需要筛选以查找代码含义的视觉噪音。”

换句话说,可读性... 我不认同,我发现 this.非常有用。


1

对我来说,那听起来像是胡说八道。使用“this”可以使代码更加优美,我看不出有什么问题。这样的策略很愚蠢(至少当你甚至不告诉人们为什么要这样做时)。


0

就我而言,我使用this来调用实例化对象的方法,而self则用于静态方法。


PHP,对于Java也是如此,但是不同的是,类名本身是前缀而不是self。 - ken

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