2009-03-26 18 views
32

これまで私が一度も見たことがないシンタックスはありますが、誰かがこのことがどういう意味なのか教えていただけますか?これが抽象的なプロパティ宣言の何らかの略語であると思われるかどうかは不明です。C#ショートノートプロパティ質問

public Class1 myVar { get; set; } 

クラス1は抽象クラスです。

答えて

82

C#3.0以降では、auto-implemented propertiesは、プロパティアクセサーで追加のロジックが不要な場合に、プロパティ宣言をより簡潔にします。また、クライアントコードでオブジェクトを作成できるようにする次の例のようにプロパティを宣言すると、コンパイラはプロパティのgetおよびsetアクセサを使用してのみアクセスできるプライベートの匿名のバッキングフィールドを作成します。

// Auto-Impl Properties for trivial get and set 
    public double TotalPurchases { get; set; } 
    public string Name { get; set; } 
    public int CustomerID { get; set; } 
+1

私はあなたに徹底的な説明をしてくれて投票するつもりですが、私はその日のためにすべて出ています。 – TheTXI

0

自動ゲッターとセッター。

7

これは自動またはauto-implementedプロパティと呼ばれ、抽象ではありません。そのプロパティはそのまま使用できます。コンパイラは、背後でバッキングストアを作成します。

これは、プロパティの代わりにフィールドを使用するのと非常によく似ていますが、プロパティセマンティクスを取得し、プロパティを必要とするデータバインディングのようなものに使用できます。

+0

また、呼び出し元へのインターフェイスを変更せずに明示的な実装に変更できます。 –

27

これは、コンパイラに(非表示の)フィールドを作成させるための構文です。

また、非常に有用なものは次のとおりです。

public Class1 myVar{ get; private set; } 
+0

'protected'も正しく動作します。ちょうど 'プライベート'のように。私はあなたが 'get'のアクセシビリティを設定できることはかなり確信していますが、私は試みたことはありません。 –

+1

+1これはまさに私が探していたものです。私は、 'set'操作をクラスメンバー関数だけで行うことができるように、何かを省略して含めることを望んでいました。ありがとう:-) – shashwat

7

それはフィールドに値を格納することがより何もしないプロパティの省略形です。インターフェイスを変更せずに、後でより複雑なevantuationで置き換えることができ前年同期比

private Class1 _myVar; 

public Class1 myVar 
{ 
    get{ return _myVar; } 
    set{ _myVar = value;} 
} 

その単純なプロパティ:だから、に相当します。

2

これらは自動実装されたプロパティです。コードをより簡潔にすることができます。あなたはここではそれらについての詳細を読むことができます:

Auto-Implement

をあなたはまた、アクセサが異なるアクセスレベルを持たせることができます。

公共int型のMyVar {取得します。プライベートセット; }

これにより、クラスの外部にプロパティを公開し、内部的に設定することができます。

22

抽象的なプロパティまたはインターフェイスのプロパティのように見えるかもしれませんが、それは遠いです。開発者がプロ​​パティを使用することを奨励するために(多くの理由でベストプラクティスであるため)、MicrosoftはC#3にこの機能を組み込むことで、プロパティを簡単に宣言できるようにしました。ここで

は、プロパティを作成するための標準的な方法です:

String foo; 

public String Foo 
{ 
    get { return this.foo } 
    set { this.foo = value; } 
} 

は今、これはタイピングのかなりを必要とし、開発者がコアに怠惰されているとして、時には我々は単にいくつかの時間を節約するために、パブリックフィールドを作成するように誘惑されています。

今C#3コンパイラで、我々はこれを行うことができます:

public String Foo { get; set; } 

を、これは少し奇妙に見えますが、コンパイラがあなたに代わってやっている仕事を考えます。前のコードはこれにコンパイルさ:

[CompilerGenerated]  
private string <Foo>k__BackingField; 

public string Foo 
{ 
    [CompilerGenerated] 
    get 
    { 
     return this.<Foo>k__BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     this.<Foo>k__BackingField = value; 
    } 
} 

ので、構文は少し奇妙に見えるにもかかわらず、あなたはまだプロパティにあなたがするために使用されている正確な方法を作成しています。