10

我阅读了这个答案及其评论,我很好奇:有什么理由不使用this/ Self/Me吗?

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

4

15 回答 15

9

警告:以下纯属主观答案。

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

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

于 2008-12-02T08:08:23.327 回答
8

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

this.Foo();

where 在Foo()外部声明为:

public static void Foo(this SomeType obj) {...}
于 2008-12-02T08:09:22.607 回答
5

它在某些情况下进行了澄清,例如 c# 中的这个示例:

public class SomeClass
{
    private string stringvar = "";

    public SomeClass(string stringvar)
    {
        this.stringvar = stringvar;
    }
}
于 2008-12-02T08:23:19.757 回答
3

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

于 2008-12-02T09:54:27.327 回答
2

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

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

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

于 2008-12-02T08:24:30.440 回答
2

我个人觉得这this.whatever不太可读。您可能不会注意到 2 行方法的区别,但请等到您在课堂上的任何地方this.variablethis.othervariable

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

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

于 2008-12-02T08:26:25.537 回答
2

好吧,eclipse用不同的颜色为字段、参数和局部变量着色,所以至少在eclipse环境中工作,不需要在语法上区分字段,以便专门将它们标记为你自己和后代的“字段”。

于 2008-12-02T08:27:12.417 回答
1

在“java中的变量”上下文中确实有人问过:

你在java中用'this'作为你的实例变量的前缀吗?

主要原因似乎是:

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

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

于 2008-12-02T08:05:46.093 回答
1

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

于 2008-12-02T08:07:04.500 回答
0

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

于 2008-12-02T08:13:47.560 回答
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;
  }
}

所以对我来说,“this”实际上是保持构造函数可读的必要条件。

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

于 2008-12-02T08:25:28.223 回答
0

'这。' in code 总是向我暗示编码器使用了智能感知(或其他 IDE 等效项)来完成繁重的工作。

我当然对此感到内疚,但是出于纯粹的虚荣原因,我会在之后删除它们。

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

限定变量

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

public void SetName(string name)
{
     this.name = name;
}
于 2008-12-02T08:38:17.527 回答
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 非常有用。阐明您正在谈论的范围。

于 2008-12-02T09:19:23.497 回答
0

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

string name;

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

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

就我而言,可读性甚至不涉及它,这完全与变量的可访问性有关。

于 2008-12-02T10:19:39.677 回答
0

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

class Foo
{
    private string bar;

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

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

于 2008-12-02T11:28:57.463 回答