有没有理由不使用“这个”(“自我”,“我”,......)?

时间:2008-12-02 08:01:21

标签: programming-languages multiple-languages

我看了this answer及其评论,我很好奇:有没有理由不使用this / Self / Me

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

15 个答案:

答案 0 :(得分:9)

警告:下面纯粹是主观的答案。

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

我个人避免使用this / self / me,除非有必要消除编译器的特定表达式的歧义。许多人不同意这一点,但我从来没有把它作为我工作过的任何团体中的一个真正的难点。

答案 1 :(得分:8)

我认为已经引用的两个帖子涵盖了大多数常见情景;主要是简洁性和冗余性与清晰度 - 一个微小的补充:在C#中,需要使用“this”来访问当前类型的“扩展方法” - 即

this.Foo();

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

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

答案 2 :(得分:5)

它在某些情况下澄清,例如c#中的这个例子:

public class SomeClass
{
    private string stringvar = "";

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

答案 3 :(得分:3)

如果你将StyleCop与所有规则一起使用,它会让你放入this.。自从我开始使用它以来,我发现我的代码更具可读性,但这是个人偏好。

答案 4 :(得分:2)

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

对于某些语言,例如PHP,甚至必须以$ this->作为前缀;如果你需要使用类字段或方法。

我不喜欢这样一个事实:如果PHP有一些方法可以在没有它的情况下引用类成员,那么它会使某些行不必要地长一些。

答案 5 :(得分:2)

我个人认为this.whatever的可读性较差。你可能没有注意到2行方法的差异,但要等到你在课堂上到处都有this.variablethis.othervariable

此外,我认为this.的使用被认为是对被憎恨的匈牙利符号的一部分的替代。有些人发现,读者看到变量是一个类成员仍然更清楚,而this.就可以了。但是,如果我们需要额外的清晰度,为什么要欺骗自己而不是使用普通的"m_"或简单"_"呢?这是5个字符对2(甚至1)。打字少,结果相同。

话虽如此,风格的选择仍然是个人喜好的问题。很难说服某人曾经以某种方式阅读代码,这对改变代码很有用。

答案 6 :(得分:2)

嗯,eclipse以不同的颜色进行颜色字段,参数和局部变量,因此至少在eclipse环境中工作,不需要在语法上区分字段,以便将它们特别标记为自己和后代的“字段”。

答案 7 :(得分:1)

之前有人问过,在“java中的变量”上下文中:

Do you prefix your instance variable with ‘this’ in java ?

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

  

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

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

答案 8 :(得分:1)

这对我来说听起来像是胡说八道。使用'this'可以使代码更好,我可以看到它没有问题。像这样的政策是愚蠢的(至少当你甚至没有告诉人们为什么会这样做时)。

答案 9 :(得分:1)

'这个'。在代码中总是向我建议编码器使用intellisense(或其他IDE等价物)来完成他们的繁重工作。

我当然对此感到内疚,但是出于纯粹的虚荣理由,我确实将其删除了。

我使用它们的唯一原因是限定模糊变量(不良做法)或构建扩展方法

限定变量

string name; //should use something like _name or m_name

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

最终,这始终是个人选择的问题。就个人而言,我使用这种编码惯例:

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;
  }
}

所以对我而言,“这个”实际上是保持构造函数可读的必要条件。

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

答案 12 :(得分:0)

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

Class Test
    Private IntVar AS Integer
    Public Function New(intVar As Integer)
       Me.Intvar = intvar
    End Function    
End Class

不是所有的时间,但主要是Me / this / self非常有用。澄清你正在谈论的范围。

答案 13 :(得分:0)

在典型的setter方法中(取自lagerdalek的答案):

string name;

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

如果你没有使用它,编译器就不会知道你指的是成员变量。
this. 的使用是告诉编译器您需要访问成员变量 - 这超出了方法的直接范围。在与成员变量同名的方法中创建变量是完全合法的,就像覆盖扩展另一个类的类中的方法一样是完全合法的。
但是,如果您仍然需要使用超类的方法,则使用 super. 在我看来使用它。并不比使用超级更差。并允许程序员在代码中更灵活。

就我而言,可读性甚至没有进入,它都是关于变量的可访问性。

答案 14 :(得分:0)

我不仅经常使用“这个”。我有时会使用“那个”。

class Foo
{
    private string bar;

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

等等。我的代码中的“那个”通常意味着同一个类的另一个实例。