2012-10-04 12 views
10

これは愚かな質問ですが、私はC#の新機能(Javaのバックグラウンドより)が新しく、プロパティのgetterとsetterに関するさまざまな例を混乱させています。getterとsetterにバッキング変数を使用する

コードは次のようになりますいくつかの状況で

private string _something; 
    public string Something 
    { 
     get { return _something; } 
     set { _something = value; } 
    } 

しかし、他の例では、彼らはこのバッキングmemeberを使用していないので、それはより多くのこのようなものです:

public string Something { get; set; } 

私はしないでくださいもちろん、変数の設定に関する複雑なロジックを持っていない限り、これらのバッキング変数(_something)を使用する利点があります。

私は後者のアプローチを使って自分のプログラムを書いていますが、何も見逃していないことを確認したかったのです。

誰かがなぜ前者を選んだのか簡単に説明できますか?それはもっと「良い練習」ですか?

ありがとうございます!

+0

私は後者がJavaの 'interface'のようなプロトタイプ定義だと思います。 –

+0

@SuzanCioc Nope。それは同じですが、バッキングフィールドはC#コンパイラによって実装されています。 –

+0

ああ、私は間違っています。これは暗黙のバッキング変数を持つ新しい構文です。 –

答えて

8

もちろん、変数の設定に関する複雑なロジックがない限り、これらのバッキング変数(_something)を使用する利点はありません。

使用しない場合は利点はありません。 2番目のアプローチでは、まだバッキング変数がありますが、コンパイラにそれを追加する作業をさせています。 .NET 3.5以降では、あなたの現在のアプローチは完全に有効です。

もちろん、余分なロジックを導入する必要がある場合は、バッキングストアの管理が重要になります。

+0

それでは、コンパイラに追加作業をさせることでオーバーヘッドが増えますか? – Riana

+1

@AngelBrighteyesいいえ - あなたが自分で書くのとまったく同じです。それはちょっとだけタイピングです。 (そして別のコンパイラで生成されたフィールド名) –

+3

@AngelBrighteyes - これは "構文的砂糖"の例です。より短いコードですが、シーンの背後でまったく同じように動作します。 –

5

以前の構文は.NET 3.5以前では必要だったため、古いコードにあります。

機能的に同等です。

+0

パーフェクト、迅速な返信をいただきありがとうございます! – rioubenson

2

public string Something {get;セット; } は単なる手です。バックグラウンドでは上記とまったく同じことをしています。

1

最初の構文を使用する良い理由の1つは、プロパティがフロントエンド要素にバインドされているMVVMアーキテクチャで使用するためです。そのバウンドプロパティが変更されていると、それは更新しなければならないことを、あなたのフロントエンドを警告する

private string _something; 
    public string Something 
    { 
     get { return _something; } 
     set { 
       _something = value; 
       OnNotifyPropertyChanged("Something"); 
      } 
    } 

:よう

何か。

+0

ああ、これはまさに私が見てきたことでしょう。私はMVVCアーキテクチャを使用してアプリケーションを構築しようとしていますので、多くのチュートリアルを使用してそれを把握しています。私はこれが私の混乱の原因であると考えています。ありがとう。 – rioubenson

0

Encapsulation Principleを破るパブリックフィールドを、宣言と同じです。したがって、同じクラス内でアクセスしない場合は、自動プロパティを使用します。それ以外の場合は、メンバ(バッキング)フィールドを使用してローカルメソッドから参照し、通常の.NETプロパティでそれらを公開します。

.NET 3で自動プロパティが追加されました。0を構文砂糖として使用するので、クラス内で参照されていないフィールドをバッキングする必要がなくなりました。

関連する問題