web-dev-qa-db-ja.com

C#省略プロパティの質問

だからここに私が今まで見たことのない少しの構文があります、これが何を意味するのか誰かに教えてもらえますか?これが抽象プロパティ宣言の略記なのか、何かまたは何なのかはわかりません。

public Class1 myVar { get; set; }

その価値については、Class1は抽象クラスです。

32
pfunk

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; }
82
alex

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

また、非常に便利です。

public Class1 myVar{ get; private set; }
27
laktak

抽象プロパティやインターフェースのプロパティのように見えるかもしれませんが、それとはかけ離れています。プロパティを使用することを開発者に奨励するために(多くの理由でベストプラクティスであるため)、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;
    }
}

したがって、構文が少し奇妙に見えても、以前とまったく同じ方法でプロパティを作成しています。

22
Andrew Hare

これは、フィールドに値を格納する以外に何もしないプロパティの省略形です。したがって、以下と同等になります。

private Class1 _myVar;

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

インターフェースを変更することなく、後でより複雑なエバンテーションに置き換えることができる単純なプロパティです。

7
DefLog

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

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

7
Joel Coehoorn

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

自動実装

アクセサーに異なるアクセスレベルを持たせることもできます。

public int MyVar {get;プライベートセット; }

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

2
Daniel

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

0
TheTXI