我应该使用“this”来调用类属性,成员或方法吗?

时间:2010-02-05 11:33:09

标签: c# java c++ coding-style

我见过一些指南或博客说使用this访问班级自己的成员是不好的。但是,我也看到了一些专业人士使用this访问的地方。我倾向于明确地使用this,因为它似乎清楚地表明我正在访问的东西是该类的一部分。

this.MyProperty = this.GetSomeValue();

使用this有什么优点或缺点?这只是一种风格偏好吗?

15 个答案:

答案 0 :(得分:13)

如果它增加了代码的清晰度,请使用它,如果它没有。有一些地方确实增加了清晰度 - 例如在C ++中:

struct Point {
   int x, y;
   Point & operator=( const Point & p ) {
      this->x = p.x;
      this->y = p.y;
      return *this;
   }
};

在这种情况下,当你有两个相同类型的对象要引用时,我发现使用this可以澄清事情(尽管注意在C ++中不需要上面的赋值运算符实现)。

答案 1 :(得分:6)

我总是使用this.因为它在我看来使代码更具可读性。它立即清楚

  • 它是此实例的成员。
  • 说明是否调用基类(base.)或覆盖成员(this.
  • 这不是静态成员。
  • 这不是对另一个静态类(this.Monster.Legs.Run(); vs Monster.Legs.Run();)成员的调用。

答案 2 :(得分:3)

有时需要,例如在构造函数(在C#或Java中)中,如果要从同名参数中指定字段。

答案 3 :(得分:3)

从使用this多年来,到找不到很多人(至少根据我的经验)使用它,我最终改变了。我可以看到有这么少的代码的好处:

  • 我对私有变量使用下划线:_myVar,因为它们总是成员变量,所以不需要this
  • 对于方法调用,很明显它是类的一部分。如果不是,您可以添加类型名称。
  • (C#)私有变量和参数总是驼峰式的。
  • 如果你的课程如此之大,那就会让人感到困惑,无论如何你都会有凝聚力和分离问题。
  • (C#) Visual Studio颜色代码类型,因此您知道您使用的是属性还是类型:

e.g。

someclass.Method(1);
SomeClass.StaticMethod(1);

我可以看到,如果你不使用下划线命名约定,并且拥有一个体重较大的大方法,可能会导致一些混乱。

静态方法或属性偶尔会混淆事物,但很少。

传递引用时,显然总是需要this关键字,例如:

someclass.Method(this);
var someclass = new SomeClass(this);

我写C#,但我的答案与Java 相关)

答案 4 :(得分:3)

我使用 this ,因为它对我来说似乎更具可读性。和...

StyleCop规则 SA1101:PrefixLocalCallsWithThis 说:

  

<强>原因

     

在C#代码文件中,对本地类的实例成员或基类的调用不带有“this。”前缀。

     

规则说明

     

只要代码包含对本地类的实例成员的调用或没有以“this”为前缀的基类,就会发生违反此规则的情况。当存在基类成员的本地覆盖时,会发生此规则的例外,并且代码打算直接调用基类成员,绕过本地覆盖。在这种情况下,调用可以以'base。'为前缀,而不是'this。'。

     

默认情况下,StyleCop不允许使用下划线或m_来标记本地类字段,而使用'this。'前缀。使用'this。'的优点是它同样适用于所有元素类型,包括方法,属性等,而不仅仅是字段,使得对类成员的所有调用都可以立即识别,无论使用哪个编辑器查看代码。另一个优点是它可以在实例成员和静态成员之间创建一个快速,可识别的区别,这些区分不是前缀。

     

使用'this。'前缀的最后一个好处就是输入这个。将导致Visual Studio显示IntelliSense弹出窗口,使开发人员可以快速轻松地选择要调用的类成员。

     

如何修复违规行为

     

要修复违反此规则的行为,请在调用类成员之前插入“this。”前缀。

答案 5 :(得分:2)

关于C ++,当使用模板时,有时必要使用this来帮助编译器进行名称解析:

 template <typename T> 
 class Base { 
   public: 
     void exit(); 
 };

 template <typename T> 
 class Derived : Base<T> { 
   public: 
     void foo() { 
         exit();   // calls external exit() or error
                   // so you should use this->exit() if that was your intent
     } 
 }; 

答案 6 :(得分:2)

一般规则应该是:使用“this”来避免含糊不清,如果你所提到的内容很明显,请不要使用它。

例如,在Java中编程时,不需要this.getSomeValue(),因为所有函数调用都是对“this”的方法调用。另一方面,如果您的方法中存在大量局部变量,或者存在静态成员变量,并且您希望明确访问实例变量,则this.myProperty可能很有用。

当然,有时“这个”是不可避免的,如

void setX(int x){ this.x = x; }

答案 7 :(得分:1)

它很不受欢迎,几乎所有的时间都在普遍使用。我从不像那样使用“这个”。

人们这样做是因为他们在编辑器中通过输入“this”然后输入“dot”来获得Intellisense。当自动代码生成器进行编码时,您也会在很多地方看到它。

现在关于为什么在整个代码中使用“this”的问题是一个坏主意。首先,它可以作为一个拐杖来掩盖缺乏良好的命名惯例。例如,我认为这段代码是“编码恐怖”:

class Fudge {
   public decimal PoundsOfChocolate {get; set;}
   Fudge (decimal PoundsOfChocoloate) {
       this.PoundsOfChocolate = PoundsOfChocolate;
   }
}

呸。最好使用商定的命名约定:

class Fudge {
   public decimal PoundsOfChocolate {get; set;}
   Fudge (decimal poundsOfChocoloate) {
       PoundsOfChocolate = poundsOfChocolate;
   }
}

为什么这样更好?好吧,在像上面这个例子这样简单的案例中,这并不重要。当函数变长时,事情会变得更糟,并且在复杂函数中有私有变量可能会与您的成员发生冲突。

另外,如果你用“this”关键词加密你的代码,由于有更多的重复文本,它会变得更难阅读。而且在没有添加语义的情况下它更加冗长。没有添加语义的IMO更加冗长是不好的。我的两分钱。向下打动你想要的一切。

这并不是说“this”没有有效用途。离得很远。如果您使用它来解决调用基本成员和当前对象中的成员之间的区别,那么它就有它的位置。它在代码生成器中也占有一席之地。但是,威士忌告诉我,过度使用任何东西都会导致痛苦。

答案 8 :(得分:1)

在objective-c

...
prop = value; // just an assignment
...

...
self.prop = value; // !!! equivalent to method call [self setProp:value]
...

差别很大 - 你必须知道你正在做什么和为什么。

答案 9 :(得分:0)

我同意戴夫的观点。它更长。

这只是风格问题,没有其他影响。

答案 10 :(得分:0)

它主要用于构造函数和初始化函数(我更喜欢这种样式的各种下划线):

MyClass(hisValue) { this->hisValue = hisValue; }

在任何地方使用这种风格只是一种让人想起匈牙利符号的语法膨胀。如果保持函数合理地缩短,则代码的读者可以立即识别局部变量和函数参数。如果声明不在屏幕内,那么可以假设它是一个类成员 - 所以'this'表示法不会添加任何有用的信息。

答案 11 :(得分:0)

我总是使用 this ,原因很简单:
(C#中的示例但不会有所作为)

举个例如这样的课:

class Foo {
    private int count = 0;
    public List<Int32> foos = new List<Int32>();

    public int DoCounting() {
       foreach (Int32 foo in foos) {
           if (foo > 50) ++count;
       }
       return count;
    }
}

现在你公司的另一个编码器必须快速添加一个功能,即计算另一个循环。他没有查看你的代码,只是因为时间关键要求而添加了他自己的代码(或者因为它是上午11:59并且他想要休息一下):

class Foo {
    private int count = 0;
    public List<Int32> foos = new List<Int32>();
    public List<Int32> bars = new List<Int32>();

    public int DoCounting() {
       int count = bars.Count;
       for (int i = 0; i < count; ++i) {
           bars[i]++;
       }

       foreach (Int32 foo in foos) {
           if (foo > 50) ++count;
       }
       return count;
    }
}

现在会发生什么?通过总是使用它可以轻松地防止这种情况吗?

Ofc这个例子是不现实的,但它很容易在更复杂的类和方法中发生,并且很难跟踪错误。

答案 12 :(得分:0)

使用此功能可使代码更清晰,更易读。您也别无选择,只能在参数名称与成员变量相同的情况下使用。你如何区分这两者?

class Test {
  int a;

  void doA(int a) {
    this.a = a; //if you do a=a its gonna be a bug really hard to catch
  }
}

答案 13 :(得分:0)

我建议始终使用this,除非代码的行为方式不同,如果不这样做的话。它至少可以作为程序员/读者的语法糖,表明RHS来自当前的类。

此外,在某些语言中(Perl为1),如果不使用对象引用,则在解析RHS时不使用继承层次结构。例如如果在父项中定义了methodName,那么$this->methodName()将起作用,但methodName()将失败,因为只搜索当前包。

答案 14 :(得分:0)

在像{/ 1>这样的代码中constructor非常有用

this.field = field;

变得更具可读性。我也会提出方法! this的着色也没有伤害。