4

自動プロパティは get および set アクセサー メソッドを定義する必要があることを知っています。また、これらのアクセサーのいずれかをアクセス修飾子によって非表示にできることも知っています。

コンパイラが満足する技術的な理由はありますか?

public object Property { get; set; }

だがしかし

public object Property { get; }

このコードの私の (おそらく間違った) 理解は、コンパイラが次のように呼び出し元のコードから隠されているバッキング フィールドを生成するということです。

private object hiddenField; //hidden by compiler.

public object Property

{

get { return hiddenField; }

set { hiddenField = value;}

}

コンパイラがそれを生成できる場合、プロパティ宣言のセッターの存在 (または欠如) に基づいて set アクセサー関数を省略できない理由はありますか?

これは技術的な制限ではなく、機能範囲の問題である可能性があることを理解しています。また、C# 言語仕様をまだ参照していないことも率直に認めます。

[更新2 ]

許してください...私はばかです:P、わかりました、先輩の瞬間を容認してくれてありがとう/

4

4 に答える 4

11

set アクセサーがないと、「hiddenField」にアクセスする方法がないため、値を設定する方法がありません。

同様に、get アクセサーがないと、設定した値を取得する方法がありません。

本当にダメになるから許されない。

ただし、2 つの方法で異なるアクセシビリティを使用できます。

public object Property { get; private set; }

これにより、セットを外部から非表示にする機能が提供されますが、使用可能なプロパティは引き続き保持されます。

于 2010-10-21T23:09:28.403 に答える
1

次のようなプロパティをどのように使用できますか?

public object Property { get; }

理論的には、そのようなものを書くことができれば、setアクセサーに欠けているため、常にnullを返します。隠しフィールドに静的な値を設定して常に返すように設定しない限り、役に立たないと思います。

于 2010-10-21T23:17:56.587 に答える
1
public object Property { get; private set; } 

動作し、期待どおりのセマンティクスを持つようになります。

于 2010-10-21T23:10:11.027 に答える
0

C# 仕様から:

バッキング フィールドにはアクセスできないため、含まれている型内であっても、プロパティ アクセサーを介してのみ読み書きできます。

アクセサーの 1 つを除外すると、クラス/構造体のコンストラクター内であっても、プロパティが読み取り専用または書き込み専用になることを意味します。あまり役に立ちません。

于 2010-10-21T23:15:28.827 に答える