会話から、C#チームは、不変型に同様の利点を提供することなく、可変型の記述を容易にしたことを理解していると思います。時間の経過とともに不変性が難しくなったわけではありません。不変であるが、他にもさまざまな欠点がある匿名型を除いて、不変性が簡単になったわけではありません。私は確かに自動プロパティが削除されることを望んでいません-それらが適切である場合、それらは本当に便利です。読み取り専用プロパティに相当するものが欲しいだけです(コンストラクターでのみ設定できるようにします)。
C#4の名前付き引数とオプションのパラメーターにより、不変型インスタンスの作成が容易になっていることがわかりました。ただし、可変性の欠点がなくても、オブジェクト初期化子の多くの利点を得ることができます。本当にオプションであるタイプの側面のデフォルト値を提供し、残りを必須のコンストラクターパラメーターとして残すだけで、呼び出し元は、名前付き引数を使用して明確にするために、必要なことを実行できます。
残念ながら、コレクション初期化子はクラックするのが難しいです。不変のコレクションで機能する「連鎖」イニシャライザーを確認したいのでAdd
、同じインスタンスを繰り返し呼び出す代わりに、コンパイラーはPlus
連鎖した呼び出しを作成できます。
ImmutableList<string> x = new ImmutableList<string> { "a", "b", "c" };
行くだろう:
ImmutableList<string> x = new ImmutableList<string>().Plus("a")
.Plus("b")
.Plus"(c");
もちろん、フレームワークにもっと不変のコレクションがあるといいでしょう:)
もちろん、これは自動小道具側には役立ちません。私は最近、プライベートセッターを使用して不変性を偽造し、一定量の不正行為を行っていることを認めなければなりません。
public string Name { get; private set; }
それは私を汚く感じさせますが、それが私の本当の意図であるときにそれを本当に不変にするわけではありません。
基本的に、私はあなたの痛みを感じていると言っています-そして私はC#チームがそうしていると確信しています。ただし、リソースが限られていることを忘れないでください。言語の設計は非常に困難です。
NDC 2010のビデオは興味深いものになるかもしれません。EricLippert、Mads Torgersen、Neal Gafter(および私)との素晴らしいパネルディスカッションがあり、C#5に関する私の提案は別のビデオにあります。