我很好奇其他人是如何使用这个关键字的。我倾向于在构造函数中使用它,但我也可能在整个类的其他方法中使用它。一些例子:

在构造函数中:

public Light(Vector v)
{
    this.dir = new Vector(v);
}

在其他地方

public void SomeMethod()
{
    Vector vec = new Vector();
    double d = (vec * vec) - (this.radius * this.radius);
}

当前回答

c++中还有一种用法没有提到,那就是不引用自己的对象,也不从接收到的变量中消除成员的歧义。

您可以使用它在从其他模板继承的模板类中将非依赖名称转换为依赖参数的名称。

template <typename T>
struct base {
   void f() {}
};

template <typename T>
struct derived : public base<T>
{
   void test() {
      //f(); // [1] error
      base<T>::f(); // quite verbose if there is more than one argument, but valid
      this->f(); // f is now an argument dependent symbol
   }
}

模板是用两遍机制编译的。在第一次传递过程中,只解析和检查非参数相关的名称,而仅检查相关名称的一致性,而不实际替换模板参数。

At that step, without actually substituting the type, the compiler has almost no information of what base<T> could be (note that specialization of the base template can turn it into completely different types, even undefined types), so it just assumes that it is a type. At this stage the non-dependent call f that seems just natural to the programmer is a symbol that the compiler must find as a member of derived or in enclosing namespaces --which does not happen in the example-- and it will complain.

解决方法是将非相关名称f转换为相关名称。这可以通过几种方式来实现,通过显式地声明它实现的类型(base<T>::f——添加base<T>使符号依赖于T,编译器只会假设它存在,并在参数替换后推迟第二次传递的实际检查。

第二种方法,如果你从有多个参数或长名称的模板继承,那就排序得更好,就是在符号前添加一个this->。因为你实现的模板类确实依赖于一个实参(它继承自base<T>) this->是实参依赖的,并且我们得到了相同的结果:this->f在模板形参替换之后的第二轮被检查。

其他回答

我一有机会就用。我相信这会使代码更有可读性,而更有可读性的代码就等于更少的bug和更强的可维护性。

我并不想这么说,但这并不重要。

认真对待。

看看那些重要的东西:你的项目,你的代码,你的工作,你的个人生活。它们中的任何一个都不会成功依赖于是否使用“this”关键字来限定对字段的访问。这个关键字不会帮助你按时发货。它不会减少bug,也不会对代码质量或可维护性产生明显的影响。它不会让你加薪,也不会让你在办公室花更少的时间。

It's really just a style issue. If you like "this", then use it. If you don't, then don't. If you need it to get correct semantics then use it. The truth is, every programmer has his own unique programing style. That style reflects that particular programmer's notions of what the "most aesthetically pleasing code" should look like. By definition, any other programmer who reads your code is going to have a different programing style. That means there is always going to be something you did that the other guy doesn't like, or would have done differently. At some point some guy is going to read your code and grumble about something.

I wouldn't fret over it. I would just make sure the code is as aesthetically pleasing as possible according to your own tastes. If you ask 10 programmers how to format code, you are going to get about 15 different opinions. A better thing to focus on is how the code is factored. Are things abstracted right? Did I pick meaningful names for things? Is there a lot of code duplication? Are there ways I can simplify stuff? Getting those things right, I think, will have the greatest positive impact on your project, your code, your job, and your life. Coincidentally, it will probably also cause the other guy to grumble the least. If your code works, is easy to read, and is well factored, the other guy isn't going to be scrutinizing how you initialize fields. He's just going to use your code, marvel at it's greatness, and then move on to something else.

下面是我使用它的时候:

从类内部访问私有方法(以区分) 将当前对象传递给另一个方法(或在发生事件时作为发送者对象) 创建扩展方法时:D

我没有对私有字段使用这个,因为我用下划线(_)作为私有字段变量名的前缀。

我养成了在Visual c++中大量使用它的习惯,因为这样做会触发智能感知,当我按'>'键时,我很懒。(而且容易出现错别字)

但我继续使用它,因为我发现它很方便,可以看到我调用的是成员函数而不是全局函数。

在Jakub Šturc的回答中,他关于在构造器之间传递数据的第5条可能需要一些解释。这是在重载构造函数中,并且是强制使用This的一种情况。在下面的例子中,我们可以使用默认形参从无参数构造函数调用参数化构造函数。

class MyClass {
    private int _x
    public MyClass() : this(5) {}
    public MyClass(int v) { _x = v;}
}

我发现有时候这是一个特别有用的功能。