4

読み取り専用のプロパティが必要な場合は、次のように記述します。

public int MyProperty { get { //Code goes here } }

ただし、Microsoft の例 (および私が見た他のいくつかの例) は次のように記述されています。

public int MyProperty { get; private set; }

この 2 つに違いはありますか? このようにプロパティを書き始める必要がありますか?

4

5 に答える 5

8

2 番目のサンプルでわかるように、プロパティの実装を省略できます。.NET は、プロパティのローカル変数を自動的に作成し、簡単な取得と設定を実装します。

public int MyProperty { get; private set; }

実際には同等です

private int _myProperty;

public int MyProperty { 
    get { return _myProperty; }
    private set { _myProperty = value; }
}

書き込み

public int MyProperty { get; }

自動プロパティはゲッターとセッターを実装する必要があるため、まったく機能しませんが、

public int MyProperty { get; private set; }

any を返す可能性のあるプロパティが残りますがint、現在のクラス内でのみ変更できます。

public int MyProperty { get { ... } }

読み取り専用プロパティを作成します。

質問:何が必要ですか? クラス内で使用されているメンバー変数が既にあり、プロパティを使用して現在の値のみを返したい場合は、完全に問題ありません

public int MyProperty { get { return ...; }}

ただし、メンバー変数を明示的に宣言せずにコード内で (他のクラスからではなく) 設定する必要がある読み取り専用プロパティが必要な場合は、このprivate setアプローチを使用する必要があります。

于 2013-06-13T07:15:31.550 に答える
6

プライベートセッターを使用すると、プロパティにセッターがない場合にのみインスタンス内でプロパティ値を割り当てることができ、その値をどこにも設定できません。

于 2013-06-13T07:15:06.380 に答える
4

プロパティで明示的なメンバー割り当てを使用しない場合、private setこのプロパティに値を設定できるようにするには、少なくとも を宣言する必要があります。そうしないと、プロパティを割り当てることができないという警告がコンパイル時に表示されます。

明示的なメンバーを使用すると、以下を追加しなくても、このメンバーに値を直接割り当てることができますprivate set

private int member ;

public int MyProperty {
    get { return member; }
}

// ...

member = 2;
int anotherVariable = MyProperty; // anotherVariable == 2
于 2013-06-13T07:14:38.920 に答える
2
public int MyProperty
{
  get
  {
    // Your own logic, like lazy loading
    return _myProperty ?? (_myProperty = GetMyProperty());
  }
}

ゲッターのみを持つプロパティは、そのプロパティへのアクセスの背後に独自のロジックが必要な場合、特にプロパティを遅延ロードする必要がある場合に非常に便利です。

public int MyProperty { get; private set; }

プライベート セッターを持つプロパティは、プロパティを外部から変更するのではなく、クラス内から維持する必要がある場合に便利です。

どちらの場合も、実際の値のバッキング データ フィールドを使用できますが、前者の場合は自分で維持する必要があり、後者の場合は生成されたコードによって維持されます。

于 2013-06-13T07:20:35.860 に答える