2010-07-17 90 views
2

之間有什麼區別:這兩個類似的代碼塊有什麼區別?

public class Person 
{ 
    public string Name { get; set; } 

    public Person(string name) 
    { 
     this.Name = name; 
    } 
} 



public class Person 
{ 
    public string Name { get; set; } 

    public Person(string name) 
    { 
     Name = name; 
    } 
} 

難道他們都不會做同樣的事情?

謝謝。

+3

如果C#和PHP一樣,第一個會改變類變量,第二個會簡單地在該函數內設置一個Name變量,一旦函數完成,它就會消失。 – animuson 2010-07-17 19:20:13

+3

很高興知道不同的語言在類似的情況下做了不同的事情。這就是爲什麼它是一個評論,這只是額外的信息。 – animuson 2010-07-17 19:22:03

回答

12

是的,他們這樣做。在第二個代碼示例中,「this」是隱含的。當你使用「這個」。您在說您指的是實例成員時更明確。

有時您需要使用此關鍵字。例如:

public class Person 
{ 
    public string name; 

    public Person(string name) 
    { 
     this.name = name; 
    } 
} 

如果沒有「this」,編譯器就不會知道您是指實例字段。

10

沒有區別;他們都做同樣的事情,並編譯到相同的IL。

我個人更喜歡使用形式

this.Name = name; 

...澄清我的意圖。如果參數與成員字段(外殼和全部)的名稱相同,那麼您將使用this來消除您指的是哪一個。

0

是的,他們做同樣的事情。

1

他們的確的確如此。這是一個品味問題。有些人喜歡說:「嘿,看我在和一個成員變量交談!故意!」。有些人有觸發intellisense的習慣。編譯器不關心你是否輸入。在一些奇怪的情況下,如果變量名稱在不同範圍內,則需要使用this.來表示,但您的示例不屬於這些情況之一。

1

是的,在語義上這兩段代碼是相同的。

的原因第一個版本是,它是共同把this在一個構造函數的類成員的前面,因爲通常是一個構造函數的參數名稱將是相同的成員名稱,並this必須用來區分。由於此屬性的後備存儲是自動生成的,並且沒有定義私人字段成員,因此名稱的大小寫不同,因此不需要this

public class Person 
{ 
    private string name; 
    public string Name { get { return name; } set { name = value; } } 

    public Person(string name) 
    { 
     this.name = name; // "this" is required in this case. 
    } 
} 
1

您顯示的兩段代碼執行的操作相同。

但是,如果你有這一點,這將是不同的:

public class Person 
{ 
    public string Name { get; set; } 

    public Person(string name) 
    { 
     String Name; 

     this.Name = name; 
    } 
} 

注意具有相同標識符的局部變量。許多人明確使用this來指代成員變量以提高可讀性並避免出現上述情況。

0

是的,他們做同樣的事情。

除了闡明你正在處理一個類的實例並將該字段與參數區分開來之外,當你使用這個然後點擊這個點時,你也會得到一些intellisense的好處。

的味道的另一個問題是,你可能會遇到是由該領域的正面前綴下劃線,而不是使用該領域從參數區分,如:

_name = name; 

這種約定也是有用如您所知,您將在列表頂部找到所有私有字段。

最後,它是不是在所有少見你的財產使用私人 setter和完全消除的支持字段,如:

public string Name { get; private set; } 

public Person(string name) 
{ 
    Name = name; 
} 

這將使我們大圈到該運營商,如果在Name(this.Name)前面使用它將編譯成完全相同的東西。

我的個人味道是不使用這個,因爲我覺得這樣做很嘈雜(如果我需要它來區分一件事與另一件事我肯定已經擰了別的東西了)。很多編寫非常優雅的代碼的人會使用它。

HTH,
Berryl

0

的加成:

即使他們這樣做,我會建議使用公共屬性爲私有成員的接口,內部參考始終使用私人字段名稱。

0

它們的編譯方式是一樣的,但有一點你會注意到,在VC#中,如果輸入「this」,IntelliSense會給你一個相關字段/屬性的列表。第一。鑑於你打字速度合理,我認爲輸入「這個」。最終爲您節省一點思考時間。