关于编程语言:是否有任何理由不使用“ this”(“ Self”,“ Me”等)?

Are there any reasons not to use “this” (“Self”, “Me”, …)?

我阅读了此答案及其评论,但我很好奇:是否有不使用this / Self / Me的原因?

顺便说一句:很抱歉,如果以前已经问过这个问题,看来不可能在SO上搜索单词this


警告:以下纯主观回答。

我认为不使用此/自己/我的最佳"理由"是简洁。如果已经是成员变量/函数,那么为什么要多余地添加前缀?

我个人避免使用this / self / me,除非有必要为编译器消除特定表达式的歧义。许多人不同意这一点,但是我从来没有在任何一个工作团队中找到真正的症结所在。


我认为大多数常见的情况已经在已经引用的两个帖子中介绍过;主要是简洁性和冗余性与清晰度之间的差异-较小的补充:在C#中,为了访问当前类型的"扩展方法",需要使用" this"-即

1
this.Foo();

其中Foo()在外部声明为:

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


在某些情况下,例如c#中的示例,它可以澄清:

1
2
3
4
5
6
7
8
9
public class SomeClass
{
    private string stringvar ="";

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


如果在所有规则上都使用StyleCop,则可以放入this.。自从我开始使用它以来,我发现我的代码更具可读性,但这是个人喜好。


好吧,eclipse会以不同的颜色来显示颜色字段,参数和局部变量,因此至少在eclipse环境中运行时,无需语法上区分字段即可为自己和后代特别地将它们标记为"字段"。


我个人发现this.whatever的可读性较差。您可能没有注意到两行方法的区别,但是请等到在类中的任何地方都得到this.variablethis.othervariable为止。

此外,我认为使用this.可以代替令人讨厌的匈牙利符号的一部分。那里的一些人发现,让读者更清楚地看到变量是类成员,而this.做到了这一点。但是,如果我们需要额外的说明,为什么还要自欺欺人而不使用普通的"m_"或仅使用"_"呢?这是5个字符对2个(甚至1个)的字符。更少的打字,相同的结果。

话虽如此,样式的选择仍然是个人喜好问题。很难说服曾经用某种方式读取代码的人对更改代码很有用。


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

对于某些语言,例如PHP,如果需要使用类字段或方法,甚至必须在$ this->前面加上前缀。

我不喜欢这样的事实,如果PHP可以通过某种方式来引用类成员而不使用它,那么它会使某些行的长度不必要地更长。


'这个。'代码中的代码总是向我暗示,编码器已经使用了intellisense(或其他等效的IDE)来完成繁重的工作。

我当然对此感到内gui,但是出于纯粹虚荣的原因,我确实将其删除。

我使用它们的唯一其他原因是限定不明确的变量(不好的做法)或构建扩展方法

限定变量

1
2
3
4
5
6
string name; //should use something like _name or m_name

public void SetName(string name)
{
     this.name = name;
}

听起来对我来说是胡说八道。使用" this"可以使代码更好,并且我看不到任何问题。这样的政策是愚蠢的(至少在您甚至没有告诉人们他们为什么实行的时候)。


确实在" java变量"上下文中有人问过:

您是否在Java中为实例变量加上" this"前缀?

经常性的主要原因似乎是:

"it increases the visual noise you need to sift through to find the meaning of the code."

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


我不仅经常使用" this"。我有时会使用"那个"。

1
2
3
4
5
6
7
8
9
class Foo
{
    private string bar;

    public int Compare(Foo that)
    {
        if(this.bar == that.bar)
        {
            ...

等等。我的代码中的" that"通常表示同一类的另一个实例。


在典型的二传手方法中(取自lagerdalek的答案):

1
2
3
4
5
6
string name;

public void SetName(string name)
{
     this.name = name;
}

如果您不使用它,编译器将不会知道您在引用成员变量。
this.的用途是告诉编译器您需要访问成员变量-该成员变量不在方法的直接范围之内。在与成员变量同名的方法中创建变量完全合法,就像在扩展了另一个类的类中覆盖方法完全合法一样。
但是,如果仍然需要使用超类的方法,则在我看来,可以使用super.。不比使用super更糟糕。并使程序员的代码更具灵活性。

就我而言,可读性甚至没有涉及,这全都涉及变量的可访问性。


在VB.NET中,我使用的一种常见做法是以下代码:

1
2
3
4
5
6
Class Test
    Private IntVar AS Integer
    Public Function New(intVar As Integer)
       Me.Intvar = intvar
    End Function    
End Class

并非一直如此,但大多数情况下,我/这个/自我非常有用。阐明您正在讨论的范围。


最后,这始终是个人选择的问题。我个人使用以下编码约定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Foo
{
  public string Bar
  {
    get
    {
      return this.bar;
    }
    /*set
    {
      this.bar = value;
    }*/
  }
  private readonly string bar;

  public Foo(string bar)
  {
    this.bar = bar;
  }
}

因此,对我来说," this"实际上是使构造函数可读的必要条件。

编辑:我在编写上面的代码时," sinje"发布了完全相同的示例。


对我来说,我使用this来调用实例化对象的方法,而self是用于静态方法的