2011-01-07 2 views
5
長所と2つのコーディングスタイル以下の違いは何ですか

...C#BestPractice:プライベートvarと公共ゲッター/セッターまたは公共ヴァール

public void HelloWorld() { 

     private string _hello; 

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

または

public void HelloWorld() { 

     public string Hello { get; set; } 

} 

私の好みはのためにあります短いシンプルなコードですが、私は長い道のりを主張する多くの開発者を見て意見を聞くことに興味があります。

+4

タイトルを「手動で実装されたプロパティと自動プロパティの違いは何ですか?」などのように変更することをお勧めします。公開されている変数(またはこの場合はフィールドである)を公開するコードサンプルはありません。 –

答えて

14

最初にアクセサーをカスタマイズすることができます。たとえば、セッターの値を検証するか、ゲッターの値を遅延ロードすることができます。また、バッキングフィールドをreadonlyにすることもできます。

第2の形式ではカスタマイズができません(ゲッターとセッターのアクセシビリティを除く)。それはちょうど最初の形式の簡略化されたものです。

getterとsetterで具体的なことを行う必要がない場合、通常は2番目の形式が便利です。

+0

コミュニティに 'readonly'について思い出させてくれてありがとう。 –

+1

貧弱な、無視された、書き込み専用のプロパティを忘れてしまった... – WernerCD

4

プライベートバッキングフィールドで初期化を行う必要がある場合や、何らかの理由でそれを必要としない限り、より簡潔な自動プロパティが一般的に好まれます。

あなたの例では、バッキングフィールドで何も行われていない場合、私はいつもauto-propertyを使用することを好みます。

4

2番目の例はパブリック変数ではなく、単なる自動プロパティです。オートプロパティは、最初の例の構文的な砂糖です。

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

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

+1 –

1

で:

ファー他の上の1つの利点が行くように、第1の方法は、あなたがゲッターやセッター(例えばnullまたはプロパティ変更通知のチェックなど)に余分な作業を行うことができます私はあなたが検証/副作用のような他のニーズを持っていないと仮定しています。

  • C#
  • の以前のバージョンにのみ第一作品のみ最初は
  • (むしろコンストラクタより)単純フィールド初期化剤を可能にするだけ最初は[NonSerialized]として、ようフィールドに属性を追加することができ(例えばBinaryFormatter)いくつかのシリアライザを破壊し、反射ベースのコードができる2つの間の切り替え

しかし、{get;set;}はより簡潔であり、ほとんどの場合好まれます。

0

ここでは、明示的な変数を使用してプロパティの値を格納するか、自動生成のプロパティ変数を使用するかを区別します。

自動生成されたプロパティ変数ではできない明示的な変数でできることはたくさんあります。これはコンストラクタではなくフィールド宣言で初期化できます。それを検証することができます。それを正規化することができます(文字列のトリミングなど)。

しかし、それを行う必要がなければ、自動小道具は問題ありません。

1

私が間違っていると私を修正しますが、私が知っている限り、自動プロパティをデバッグすることはできません。 link text

ゲッター/セッターにブレークポイントが必要な場合は、詳細フォームが必要です。

関連する問題