2011-01-07 122 views
5

有什麼優點及以下兩種編碼風格之間的差異...C#BestPractice:私人var和公共的getter/setter或公共變種

public void HelloWorld() { 

     private string _hello; 

     public string Hello {  
      get 
      { 
       return _hello; 
      } 
      set 
      { 
       _hello = value; 
      } 
     } 
} 

public void HelloWorld() { 

     public string Hello { get; set; } 

} 

我的選擇是對簡短的簡單代碼,但有興趣聽到意見,因爲我看到許多堅持漫長路線的開發者。

+4

我建議將標題改爲*「手動實現的屬性和自動屬性之間的區別」或類似的東西。您的代碼示例都沒有公開變量(或者是字段,因爲它應該在這種情況下)。 – 2011-01-07 20:52:50

回答

14

第一個允許您自定義訪問器。例如,你可能想要驗證setter中的值,或者在getter中延遲加載該值。它也可以讓你做後臺readonly

第二種形式不允許定製(除了getter和setter的可訪問性)。這只是第一種形式的縮寫。

如果你不需要在getter和setter中做任何特定的事情,第二種形式通常更方便。

+0

感謝您提醒社區關於`readonly`。 – 2011-01-07 20:51:26

+1

窮人,被忽視,被遺忘的只寫屬性... – WernerCD 2011-01-07 21:53:28

4

除非您需要對私有支持字段執行一些初始化或出於某種其他原因需要它,否則通常首選更簡潔的自動屬性。

因此,對於您的示例,如果在後臺字段中沒有任何內容正在處理,我總是更願意使用auto屬性。

4

你的第二個例子不是一個公共變量,它只是一個自動屬性。自動屬性只是第一個例子中的語法糖。

僅就在另一個的優點去,第一種方式可以讓你做的額外工作的getter或setter(如空或屬性更改通知的檢查):

private string _name; 
public string Hello {  
{ 
    get 
    { 
     if(_name == null) 
      _name = "Default Name"; 

     return _name; 
    } 
    set 
    { 
     _name = value; 
     OnPropertyChanged("Hello"); 
    } 
} 
1

在以下我假設你沒有任何其他需求,如驗證/副作用。

  • 只有在早期版本的C#
  • 的第一部作品只有第一個允許簡單的現場初始化器(而非構造函數)
  • 只有第一個允許添加屬性的例如,爲[NonSerialized]
  • 兩個之間的切換可破壞某些串行器(BinaryFormatter例如)和基於反射的代碼

{get;set;}更簡潔,並且在大多數情況下都是首選。

0

您在此處繪製的區別是使用顯式變量來存儲屬性的值與使用自動生成的屬性變量之間。

有很多事情你可以做一個顯式變量,你不能用自動生成的屬性變量。您可以在字段聲明中初始化它,而不是在構造函數中初始化它。你可以驗證它。你可以規範化它(如修剪字符串等)。

但是,如果你不需要做任何的,那麼汽車道具就好了。

1

糾正我,如果我錯了,但據我所知,你不能調試汽車性能。 請參閱link text

所以,如果您需要getter/setter的斷點,您將需要詳細的表單。