關於this指針的使用注意事項詳解

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章