web-dev-qa-db-ja.com

自動的に実装されるプロパティでgetアクセサーとsetアクセサーの両方を定義する必要がある理由

次のようなプロパティを定義すると

    public string Name {get; set;}

ドットネットは、プロパティコードを作成できます。しかし、私たちが使用するとき

    public string Name {get;}
    public string Name {set;}

私たちは直面する

'Hajloo.SomeThing.PropertyName.set' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors.

コンパイラがプロパティを決定できず、コードを自動的に作成できないのはなぜですか?どうしたの?

32
Nasser Hadjloo

自動実装プロパティは、プロパティ値の独自のバッキングストアを生成するためです。内部ストアにアクセスできません。

でプロパティを実装する

  • ただ取得する:値のみを取得できることを意味します。プロパティ値を設定することはできません(包含クラス内でも)
  • ただ設定:値のみを設定できることを意味します。プロパティ値を取得できません。

通常のプロパティ

private int _data;
public int Data{  get { return _data } };

ここで、親クラスはクラスの他の場所で次のことを実行できます(自動小道具ではできません)

_data = 100;

注:このようなauto-propを定義できます(これが私が最もよく使用する方法です)。

public int Data { get; private set;}

つまり、クラスの外部クライアントはプロパティを設定できません。ただし、包含クラス自体は、クラス定義内のthis.Data = x;を介してプロパティを複数回設定できます。

58
Gishu

セッターがない場合、プロパティはデフォルト値以外にはなり得ないため、何の目的も果たしません。

5
Joe

このエラーを受信するためのより現代的なシナリオは、VS 2015より前のバージョンのVisualStudio(または14より前のMsBuildを使用)を使用してC#6構文を使用するコードをビルドすることです。

C#6.0では、セッターを持たないautoPropertiesを使用できます(これらはプライベートセットと見なされます)。

VS2015 +またはmsbuild 14+でコンパイルするか、コードを変更してすべてのautoPropertiesにセッターを設定します。

2
Bill Tarbell