2013-02-09 189 views
1

我知道關鍵字「this」是指類變量中的構造函數之外的變量。但爲什麼不只是將參數的名稱更改爲(string _name,string _alias),教程中的「this」的所有示例都只是說明了明顯,但我想知道爲什麼需要在某個特定關鍵字情況。c#關鍵字

private string name; 
private string alias; 
    public Employee(string name, string alias) 
    { 
     this.name = name; 
     this.alias = alias; 
    } 
+0

請參閱[此(C#參考)](http://msdn.microsoft.com/en-us/library/dk1507sz.aspx)。 – 2013-02-09 19:19:12

+0

否則,您將無法區分參數和類別字段?您可以將它們命名爲_name,但它不是「漂亮」,並且說「_name = name」 – TryingToImprove 2013-02-09 19:25:58

+0

這只是命名習慣..請看這裏:http://msdn.microsoft.com/en-us/library/xzf533w0 %28VS.71,經典%29.aspx – TryingToImprove 2013-02-09 19:40:18

回答

1

我的名字私有成員變量_x爲了避免這樣的情況下。 Arguments for/against this abound

private string _name; 
public Employee(string name, string alias) 
{  
    // Equivalent to `this._name = name`, as _name is not shadowed 
    _name = name; 
} 

在另一方面,我反對命名參數_x因爲參數名合同 公衆的一部分。這個合同應該是乾淨的,穩定的,並且應該由包含成員變量名稱的內部實現來決定是否而不是

在過去,我使用employeeName,aNametheAlias這樣的名稱來表示這種情況下的參數,但我不喜歡最終被使用的人爲修飾符。如果我不能使用私人變量的下劃線,我會使用this.x而不是三思而後行。


需要這種形式是由於this是在C#和可變陰影的 「隱式」。也就是說,this.x是必要的,因爲x將引用一個局部變量/參數,如果它存在 - 並且它在這裏執行。

private string name; 
public Employee(string name, string alias) 
{ 
    // Re-assignes parameter to itself. 
    // Does NOT assign member variable! 
    name = name; 
} 

我認爲,強調在名稱打破「CLS兼容」,但不是一個問題對我來說,只有採用這種約定私人成員變量避免公開揭露這種不兼容的名字。

+0

根據來自Microsoft的指導原則,他們在字段前加上前綴。「不要將字首應用於字段名稱或靜態字段名稱。具體而言,請勿將字首應用於字段名稱以區分靜態字段和非靜態字段。例如,應用g_或s_前綴不正確。http://msdn.microsoft.com/en-us/library/ta31s3bc%28VS.71%29.aspx,但許多用戶(http://stackoverflow.com/questions/1630844/c-sharp-member-variables-fields-naming-convention)前綴..我反對前綴.. ;-) – TryingToImprove 2013-02-09 19:38:53

+1

@TryingToImprove我不會使用'g_'或's_'。這顯然是錯誤的(對我來說),特別是當表示靜態/非靜態時。 'm_'太吵了,但我發現'_'用於*私有成員變量*恰到好處。我實際上添加了[這個答案的摘錄](http://stackoverflow.com/a/1630928/166390),並遵循[鏈接的文章準則](http://10rem.net/articles/net-naming-conventions -and-programming-standards --- best-practices):D – 2013-02-09 19:40:16

+1

我不想和你爭論:-)我可以看到贊成/反對這樣做。我用'_'在JavaScript中加上「privates」。但在C#中,我的私有是camelCase,而public是CamelCase。我不記得上次我必須有一個「公共」字段。 – TryingToImprove 2013-02-09 19:44:48

3

在你的例子中,你可以在你的字段名稱上加一個下劃線,所以不需要this(它仍然是允許的,但不是必需的,因爲如果沒有與局部變量衝突可以推斷)。事實上,微軟的標準鼓勵這樣做。

但是,仍然有很多情況下您可能需要this關鍵字。

一個例子是,如果你有在接受了Employee另一個類的實用程序,如:

public static class Utility 
{ 
    public static void SomeMethod(Employee employee) 
    { 
    } 
} 

,你想打電話從Employee類中這個工具,你必須把它叫爲Utility.SomeMethod(this);

此外,在當前實例上調用的擴展方法必須以this.開頭。考慮下面的擴展方法:

public static class UtilityExtensionMethods 
{ 
    public static void SomeExtensionMethod(this Employee employee) 
    { 
    } 
} 

,如果你想從Employee類中調用該擴展方法,你將不得不稱其爲this.SomeExtensionMethod();