2009-08-19 83 views
3

注意,下面的代碼是在一個單獨的類使用私人或使用屬性? C#

private string _fee; 
private string _receipt; 

public string Fee 
{ 
    get { return _fee; } 
    private set { _fee = value; } 
} 

public string Receipt 
{ 
    get { return _receipt; } 
    private set { _receipt = value;} 
} 

public MyValue(string fee, string receipt) : this() 
{ 
    _fee = int.Parse(receipt).ToString(); 
    _receipt = receipt; 
} 

正如你可以看到我的財產什麼也不做,所以我應該使用

_fee = int.Parse(fee).ToString(); 
_receipt = receipt; 

Fee = int.Parse(fee).ToString(); 
Receipt = receipt; 
+0

哦,這是我與ReSharper的使用的第一個腳本。我就喜歡! – 2009-08-19 15:52:19

回答

16

使用屬性,如果你在C#3你應該使用自動實現的屬性是這樣的:

public string Fee 
{ 
    get; private set; 
} 

public string Receipt 
{ 
    get; private set; 
} 

public MyValue(string fee, string receipt) : this() 
{ 
    this.Fee = int.Parse(fee).ToString(); 
    this.Receipt = receipt; 
} 
10

我總是使用屬性 - 它給你更多的靈活性:

  • 你以後可以創建更復雜的getter和setter方法,如果需要的話
  • 你可以在getter和setter
  • 指定不同的可見性,您可以定義虛擬性和覆蓋在派生類中,如果需要的話
  • 您可以使用數據綁定對性能,而不是場

而且,似乎.NET反射表現略有不同的性質與領域,所以如果你有屬性和字段的組合,你需要知道這些細微的差異 - 如果你只使用屬性,y ou're好去:-)

雖然類中,你可以使用後備存儲領域要麼,或財產 - 如果你使用的財產,任何副作用的制定者可能有(更新等領域,記錄您的通話等)將被使用 - 如果您直接訪問後備存儲區域,則可以解決這些問題。這可能是一個好的或壞的事情 - 取決於你的情況。只要注意你在做什麼! :-)

馬克

+0

+1,但我會添加「不破壞二進制兼容性」到您的第一點和反思評論。否則,你仍然可以重新考慮私人領域。 – 2009-08-19 15:57:26

+0

我開始想知道如果c#編譯器甚至應該允許公共字段。似乎沒有理由使用它們。 – 2009-08-19 16:38:14

4

在這種情況下,它並不重要,因爲只要你在你的代碼中保持一致。

但是,如果你的屬性標記爲virtual,那麼它不會訪問它們在構造函數是個好主意,這將是不如直接使用的字段。這是因爲你的屬性的行爲可能被覆蓋,你的基類可能會調用破壞代碼。


編輯:只是爲了澄清,我只是參照了OP的例子中,方法上的差異。 marc_s給出了一些很好的觀點,說明爲什麼在大多數情況下,特性可能是有利的。

0

我總是會直接使用成員。

這是因爲你可以在不能因爲一些其他領域不被設定成從構造方法中正常運行的setter執行代碼。

如果作爲womp提到的特性是虛擬的,有可能成爲更糟。