2012-03-10 19 views
11

自動プロパティを使用すると、コンパイラは画面の背後に独自のバッキングフィールドを作成することがわかります。しかし、私が学ぶために読んだ多くのプログラムでは、人々が明示的に書くことが分かりますバッキングフィールドがある場合とない場合の自動プロパティ - プリファレンス?

private int _backingField; 

public int Property { get { return _backingField; } } 

上記と以下の違いは何ですか?

public int Property { get; private set; } 

は、私はあなたが実際にゲッターやセッターでの副作用を持っているときに明らかにプロパティを使用することを理解し、それは多くの場合ではありません。また、構造体の場合は、バッキングフィールドを明示的に使用する必要があることを理解しています。プロパティを使用してメンバーにアクセスすることはできません。

私が見つけた唯一の違いは、値を呼び出す方法が定義されているクラスの中で違うということです。単純な設定ですか、それともそのプロパティを介して値を呼び出すためのものか直接フィールドにアクセスすることによって? 簡単な表記法ですか?

答えて

14

2つのスニペットの違いはあまりありません。たとえば、参照によってプロパティを渡すことはできませんが、それはほとんど問題ではありません。あなたは、フィールドはこのように、読み取り専用になりたい場合は、:

private readonly int _backingField;  
public int Property { get { return _backingField; } } 

そして違いがあります。上に書いたコードは、クラス内の値が変更されることを防ぎ、これが本当に不変であることを明確にしています。私は実際には、読み取り専用のフィールドを宣言することができますが、読み取り専用のコンストラクター内でのみ設定可能なプロパティを自動的に実装していますが、現時点では利用できません。

これが道で、かなり混乱して:

はまた、私はあなたが明示的に構造体の場合には、バッキングフィールドを使用する必要があることを理解し、プロパティを経由して、そのメンバーにアクセスすることはできません。

どういう意味ですか?あなたは間違いなく構造体内のプロパティを使うことができます。

foo.someField.X = 10; 

foo.SomeProperty.X = 10; 

:あなたは可変構造体、すなわち間の差があるバッキングフィールドについて話していますか?もしそうなら、私は通常、構造体を不変にすることで問題を回避します:)

+1

XNAのVector2を例として使用して、私が言うところなら public Vector2 TheVector {get;セット; } 私は電話できません TheVector.X = 10; 代わりに、実際のフィールドを使用する必要があります。値渡し/参照渡しの何か。 (C#の値/参照を渡すことを明確にするための読書資料がありますか?) – Taelia

+0

また、私の2つの例の間に実際の違いがない場合、なぜ多くの人々が明示的に目的)? – Taelia

+0

@Taelia:そうですね、それは可変構造のケースです - 私はこれを避けるのが普通です。これは、プロパティーが値のコピーを戻すためです。そして、私は他の人が何をするのか理由を述べようとはしません。 –

関連する問題