C#で、自動実装プロパティを宣言する場合、getとsetの両方の部分を宣言する必要があるのはなぜですか?
すなわち
public string ThisWorks { get; set; }
public string ThisDoesnt { get; }
これは単なるシンタックスシュガーではありませんか?つまり、コンパイラはプロパティのプライベートフィールドを挿入しますか?では、なぜ問題なのですか?
奇妙。
C#で、自動実装プロパティを宣言する場合、getとsetの両方の部分を宣言する必要があるのはなぜですか?
すなわち
public string ThisWorks { get; set; }
public string ThisDoesnt { get; }
これは単なるシンタックスシュガーではありませんか?つまり、コンパイラはプロパティのプライベートフィールドを挿入しますか?では、なぜ問題なのですか?
奇妙。
セッターがなかった場合、どのようにプロパティを設定しますか?
ちなみに、アクセシビリティを指定できます。例:
public string Foo
{
get;
private set;
}
セッターがないと、バッキング変数の名前を指定する方法がないため、値を指定することはできません。
次のように宣言された読み取り専用の自動プロパティをリクエストしました。
public string ReadonlyProperty { get; readonly set; }
これにより、読み取り専用のバッキング変数、ゲッターのみを持つプロパティが作成され、セッターへのすべての呼び出しが変数への直接アクセスに変換されます。通常の読み取り専用変数の場合と同様に、コンストラクター内でのみセッターを呼び出すことができます。
このリクエストがうまくいくかどうかを確認します...可変タイプよりも不変タイプの実装が難しくなるため、現時点では存在しないのは本当に残念です:(
自動実装されたプロパティにはアクセス可能なプライベートストアがないため、セッターなしで値を設定する方法はなく、まったく役に立たなくなります。
セットが必要です-そうでない場合、自動実装されたプロパティはどのようにその値を取得しますか?プロパティを自動実装する場合は、少なくとも構築中に値を与えるために、アクセサを設定する必要があります。
興味深いことに、Visual Studio 2015 の新しい Roslyn コンパイラでは、プロジェクトが C# バージョン 5 を使用するように構成されている場合でも、これが可能になりました。