this 指针简介
在面向对象的程序设计语言中,都有一个默认的this
关键字。这个关键字的作用就是代表当前对象,可以通过 this
引用所有的类内的全局变量或方法。但是 this
指针在使用的时候,有很多要注意的地方,如果不注意的话,会造成滥用带来未知的麻烦。
使用限制
- 只能在非静态方法中使用,包括普通方法和构造函数;
- 可以引用所有的类的成员,包括字段和方法;
- 只能在方法体内使用,包括普通方法和构造函数。
必需使用的场景
在带有构造函数中,如果传入参数与类的成员变量名称一致时,必需要使用 this
指针进行区分。举例来说,如下代码所示,在 Person
的构造函数中,由于传入的参数 name
与类的成员变量 name
是一样的。根据就近优先的原则,如果不加 this
那么 name
默认指的是传入参数,只有要加上 this
指针后,才会调用 Person
类的 name
字段。
class Person{
String name;
public Person(String name){
this.name = name;
}
}
不推荐使用的场景
由于主流的编辑器,如VS,XCode,Eclipse等都提供了代码补全功能,所以很多人为了编写省事,都会先写一个 this
然后加上点以后,会弹出可以调用的代码补全,于是代码中的很多类的成员变量都有一个 this.
,如 this.name
。
现代代码编写的一个重要原则是简单至上(参见KISS原则),所以只有在 this
有意义的时候才应该使用它,多余的 this 除了没有用,在某些时候也会带来一定的麻烦。我们以下面的示例来说。
public void SetText(string txt){
if(!string.IsNullOrEmpty(txt))
this.button1.Text = txt;
}
在以上的代码中,我们编写了一个函数,用于给 button1.Text
赋值。后来我们发现,很多按钮都有这个需求,由于我们就修改这个函数,变为能用的函数,修改后代码如下:
public void SetText(Button button1, string txt){
if(!string.IsNullOrEmpty(txt))
this.button1.Text = txt;
}
以上的代码如果放在类中仍然是没问题的,可以 供所有的按钮使用,但是如果把这个方法抽出来放到一个专门的类中,或者把这个方法变成静态方法,那么都会因为 this.
而导致这个函数出错。
也许有人觉得就一个 this.
不多,改一下就好。但是如果方法体中有大量的 this.
,或者有多个方法需要重构的时候,就会给我们带来多余的麻烦。而且,这本来就是多余的时候,在开始的时候就不应该让它出现。
总结
在面向对象程序设计语言中,this
指针是都有的一个重要的关键字,本文对 this
指针的用法和注意事项进行了介绍。同时对它的必用场景和不推荐的场景进行了介绍。