なぜ私たちは書くことができるのですか
public int RetInt
{
get;set;
}
それ以外の
public int RetInt
{
get{return someInt;}set{someInt=value;}
}
2つの違いは何ですか?
なぜ私たちは書くことができるのですか
public int RetInt
{
get;set;
}
それ以外の
public int RetInt
{
get{return someInt;}set{someInt=value;}
}
2つの違いは何ですか?
この機能は自動実装プロパティと呼ばれ、C# 3.0 で導入されました。
C# 3.0 以降では、プロパティ アクセサーに追加のロジックが必要ない場合、自動実装されたプロパティによってプロパティ宣言がより簡潔になります。また、クライアント コードでオブジェクトを作成できるようにします。次の例に示すようにプロパティを宣言すると、コンパイラは、プロパティの get および set アクセサーを介してのみアクセスできるプライベートな匿名バッキング フィールドを作成します。
class Customer
{
// Auto-Impl Properties for trivial get and set
public double TotalPurchases { get; set; }
public string Name { get; set; }
public int CustomerID { get; set; }
あなたの質問について
2つの違いは何ですか?
あなたの場合、なし。値の設定または取得中に何もしていないため、何らかの検証を行うか、他のタイプのチェックを実行したいとします。
private int someInt;
public int RetInt
{
get
{
if (someInt > 0)
return someInt;
else
return -1;
}
set { someInt = value; } // same kind of check /validation can be done here
}
上記は Auto 実装プロパティでは実行できません。
違いがわかるもう 1 つのことは、カスタム クラス タイプのプロパティを初期化するときです。
ThenのリストがあればMyClass
、Normal プロパティの場合、そのバッキング フィールドはコンストラクター以外で初期化/インスタンス化できます。
private List<MyClass> list = new List<MyClass>();
public List<MyClass> List
{
get { return list; }
set { list = value; }
}
Auto実装プロパティの場合、
public List<MyClass> SomeOtherList { get; set; }
コンストラクターでのみ初期化できSomeOtherList
ます。フィールド レベルでは初期化できません。
これらの 2 つの違いは何ですか?
少なくとも2 つの点で異なります。
someInt
あなたの場合)set/get
つまり、「プロパティのみ」が必要な場合は自動プロパティを使用し、ワークフローをより詳細に制御する必要がある場合 ( でイベントを発生させset
、デバッグし、内部で他のものを実行する)、「通常の」プロパティを使用します。
これらは自動実装されたプロパティです。詳細については、 http://msdn.microsoft.com/en-us/library/bb384054.aspxを参照してください。
これらが導入された基本的な理由はsomeInt
、プロパティで使用されるよりもほとんど使用されないようなプライベート変数を作成するプログラマーのオーバーヘッドを削減することでした。
どちらの場合も、プロパティに対応するプライベート フィールドがありますが、最初のケースでは、コンパイラによって生成され、非表示になります。
クラスでプロパティの背後にある変数を頻繁に使用する必要がある場合は、プロパティを古い方法 (2 つ目) で宣言する方がよいと思います。新しい方法。
クラス外からのみ使用する必要がある場合 (またはほとんどの場合)、「新しい」方法 (最初の方法) を使用できます。