2010-02-21 67 views
1

我正在研究Head First C#(到目前爲止它已經進行得很順利),但是我在使用「this」的語法時遇到了很多麻煩。關鍵詞。正確使用「this」。關鍵字在C#中?

概念,我得到我應該用它來避免參數掩蓋同名的領域,但我無法真正通過自己的例子(也,他們似乎沒有跟蹤它有一個專用於該特定關鍵字的部分,他們只是解釋它並在他們的示例中開始使用它)。

在應用「這個」時,有沒有人有任何好的經驗法則?或者網上的任何教程,以不同的方式解釋它,頭First C#?

謝謝!

+0

的[你什麼時候使用 「this」 關鍵字?](http://stackoverflow.com/questions/23250/when-do-you-use-the-this-keyword) – nawfal 2013-11-13 18:06:56

回答

1

我寫this.當且僅當它增強了可讀性,例如,實現Comparable接口時(Java的,但這個想法是一樣的):

public void compareTo(MyClass other) { 
    if (this.someField > other.someField) return 1; 
    if (this.someField < other.someField) return -1; 
    return 0; 
} 

至於參數陰影(例如,在構造函數) :我通常給這些相應的場的一個較短的名稱,例如:

class Rect { 
    private int width, height; 
    public Rect(int w, int h) { 
    width = w; 
    height = h; 
    } 
} 
11

個人時,我有我只用它來它是:

  • 構造鏈接:

    public Foo(int x) : this(x, null) 
    { 
    } 
    
    public Foo(int x, string name) 
    { 
        ... 
    } 
    
  • 複製從參數名稱到字段(不是在C#作爲共同在Java中,如你平時使用屬性 - 但常見於構造函數)

    public void SetName(string name) 
    { 
        // Just "name = name" would be no-op; within this method, 
        // "name" refers to the parameter, not the field 
        this.name = name; 
    } 
    
  • 參照該對象,而無需涉及任何成員:

    Console.WriteLine(this); 
    
  • 聲明的擴展方法:

    public static TimeSpan Days(this int days) 
    { 
        return TimeSpan.FromDays(days); 
    } 
    

其他一些人總是使用它(例如對於其他方法調用) - 我個人發現有點混亂。

+1

可能重複關鍵字也用於擴展方法。 – masfenix 2010-02-21 19:32:53

+0

@Jon,我對你對第二個例子的想法很感興趣。就個人而言,我只是將支持字段命名爲不同以避免衝突,並刪除對「this」關鍵字的需求。 (通常像私人成員字段'_name') – 2010-02-21 19:40:32

+1

@masfenix:謝謝,將補充說。 @西蒙:不,我喜歡這個。我不喜歡前綴(我發現干擾了我的閱讀),如果我爲一個概念選擇了一個名字,那麼推測它是我能想到的最好的一個。寫作「這個」的痛苦。偶爾相對較小。 – 2010-02-21 19:47:45

0

基本上,this爲您提供了當前對象的參考。您可以使用它來訪問對象上的成員,或將當前對象作爲參數傳遞給其他方法。

它在幾乎所有情況下的訪問成員變量或方法調用之前將其完全沒有必要,但也有一些風格指南推薦它的各種原因。

就個人而言,我要確保我的名字我的成員變量是明顯不同的從我的參數,以避免以往任何時候都不必使用「本」。例如:

private String _someData; 
public String SomeData 
{ 
    get{return _someData;} 
    set{_someData = value;} 
} 

這是非常個人的偏好,雖然,有些人會建議你命名的財產和成員變量一樣(只是大小寫不同 - 「someData」和「SomeData」),並使用該關鍵字在訪問私有成員以指示區別時。

因此,根據經驗法則 - 避免使用它。如果你發現自己使用它來區分本地/參數變量和成員變量,然後重命名其中一個,所以你不必使用'this'。

我將使用它的情況是多個構造函數,將引用傳遞給其他方法和擴展方法。 (見Jon's answer的例子)

2

StyleCop的默認編碼風格強制執行以下規則:

A1101:爲{方法或屬性名稱 }調用必須與開始‘這個’ 前綴以指示該項目是該類的一個 成員。

這意味着屬於當前類的每個方法,屬性,屬性都將以此爲前綴。我最初對這個規則有抵觸情緒,這使得你的代碼更加冗長,但是它已經增長了,因爲它使得代碼非常清晰。 This thread discusses the question

+1

我認爲這是最糟糕的StyleCop規則之一,僅次於對每個私人領域發表評論。 – 2010-02-21 19:52:16

0

如果你在一個使用相同類的字段的類中有一個方法,你可以使用它。

public class FullName 
    { 
     public string fn { set; get; } 
     public string sn { set; get; } 

     //overriding Equals method 
     public override bool Equals(object obj) 
     { 
      if (!(obj is FullName)) 
       return false; 

      if (obj == null) 
       return false; 

      return this.fn == ((FullName)obj).fn && 
      this.sn == ((FullName)obj).sn; 
     } 

     //overriding GetHashCode 
     public override int GetHashCode() 
     { 
      return this.fn.GetHashCode()^this.sn.GetHashCode(); 
     } 
    }