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
指針的用法和注意事項進行了介紹。同時對它的必用場景和不推薦的場景進行了介紹。