2010-02-12 56 views
7

我看到這一切的時候:爲什麼你在C#getter/setters中使用私有變量?

private int _myint; 

    public int MyInt 
    { 
     get 
     { 
      return _myint; 
     } 
     set 
     { 
      _myint = value; 
     } 
    } 

對我來說這似乎是相同的:

public int MyInt{ get; set; } 

那麼,爲什麼大家都做前...爲什麼私人VAR AT ALL?

+6

在* both *個案中都有一個私有變量,但是在第二種情況下它是由編譯器生成的。 –

回答

31

首先,這是C#3.0的新特性,它在此之前並未出現。其次,如果你想添加任何自定義邏輯到你的getter和setter,你別無選擇。所以是的,在你沒有定製邏輯的例子中,它是同樣的事情(事實上編譯器爲你在後臺生成),但是如果你想舉一個事件或者類似的東西,你必須明確關於它。

+3

BFree提到的事件的完美示例是在MVVM中,您需要提高PropertyChanged以使GUI反映新的數據綁定值。 – Dave

4

首先,您使用的語法是新的。它在早期版本的C#中不存在。

其次,你需要私有變量,如果你要有一個默認值,或者延遲加載結果。

2

你喜歡不認識你的私人部分的人嗎?我希望不是。這是一種提供本質上代表您擁有但不想放棄控制的東西的方法。如果你決定要驗證int是肯定的,你可以開始做,如果你的代碼如圖所示。

C#使這個透明現在具有自動屬性。

2

在C#3之前,這是做到這一點的唯一方法。隱式類型的屬性尚不可用。人們仍然想抽象出私人成員。如果開發人員仍然在C#3中這樣做,他們要麼不知道新的更改,要麼需要提供自定義的獲取/設置邏輯。

1
public int MyInt{ get; set; } 

是在C#3.0中添加的一項名爲「自動屬性」的功能。 C#2.0不支持這一點,並需要使用顯式getter和setter的私有變量。因此,許多較舊的代碼或向後兼容的代碼將使用顯式的getter和setter。

2

這是老辦法。你喜歡的方式(「自動屬性」)是一種相對較新的語言結構。幾年前,我們總是不得不使用私有變量。

也可能有其他原因使用私有變量,儘管不是在您提供的簡單示例中。例如,如果您需要使用默認值初始化該屬性,則無法真正使用自動屬性完成此操作;相反,你需要在構造函數中進行初始化。

6

我想看到

public int MyInt{ get; private set; } 

更多;)

但@BFree釘它

+0

那麼我該怎麼做那個班的「私人設置」呢? – herzmeister

+0

@hdw - 你可以在課堂上設置它,你不能從課堂以外進行設置。 – Steve

+0

我在使用「轉儲屬性」的類的情況下使用了這種模式;但是,正如其他響應中所述,自動屬性排除了在獲取或設置期間可能需要發生的任何自定義邏輯。 –

1

如果你看一下由編譯器與像反射器的工具產生的輸出已添加私人字段

4

擴展@BFree所說的內容的示例:

private int _Whatever; 
public int Whatever 
{ 
    get {return _Whatever;} 
    set 
    { 
     if(value != _Whatever) 
     { 
      // It changed do something here... 
      // maybe fire an event... whatever 

     } 

     _Whatever = value; 

    } 
} 
相關問題