8

私はautoプロパティを頻繁に使用しましたが、コンストラクターで初期化された読み取り専用のバッキングフィールドを使用してクラスを設定することからますます離れています。私はすべてのセッターを削除し、プロパティにセッターが明らかに必要な場合にのみバックを追加します。

これにより、クラスがより堅牢でエレガントなOOになり、以前にこれを行わなかったことに自分自身を蹴っています。

コンストラクターは一般的にc#コード例で非常に十分に活用されておらず、自動プロパティとオブジェクト初期化子がこれの大きな部分であると思うので、私の質問は、なぜc#チームがこのような機能をプッシュし、ベストプッシュ機能の提供に重点を置いていないのかということですもっと練習します。一般的に、悪いコードを書くのは簡単すぎると思いますし、コーダーが良いコードを書くのを助けるためにもっと多くのことができると信じています

4

3 に答える 3

13

会話から、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に関する私の提案は別のビデオにあります。

于 2010-09-03T23:06:58.917 に答える
1

私はすべてのセッターを削除し、プロパティにセッターが明らかに必要な場合にのみバックを追加します。これにより、クラスがより堅牢でエレガントになります。

私はあなたに完全に同意します。一部のクラス階層に使用されるオブジェクト初期化子が多数あるレガシーコードに直面しました。いくつかのプロパティを追加する必要がありましたが、クラスインスタンスが構築されているすべての場所を見つけるのに頭が痛くなりました。初めて提出しました。そして今、私はもう1つのプロパティを追加する必要があります。狂ってる!

オブジェクト初期化子の使用を制限するために、パラメーターなしのコンストラクターを削除しました。

于 2012-07-26T08:56:36.430 に答える
0

一般的に、C# コード例ではコンストラクターが非常に十分に使用されていないことがわかり、自動プロパティとオブジェクト初期化子がこの大きな部分を占めていると思います

オブジェクトに多くのプロパティがある場合、コンストラクターからすべてを初期化したくないことは明らかです。たとえば、4 つまたは 5 つ以上のパラメーターを渡す必要があると、読みやすさがかなり低下します (Intellisense を使用すると簡単に記述できますが)。また、いくつかのプロパティのみを初期化し、他のプロパティには既定値を使用する場合は、多くのコンストラクター オーバーロードが必要になるか、これらの既定値をコンストラクターに明示的に渡す必要があります。

このような場合、プロパティが読み取り専用でない限り、オブジェクト初期化子は非常に便利です (ただし、Jon が指摘したように、C# 4 のオプションのパラメーターは良い代替手段です)。

なぜC#チームはこのような機能をプッシュし、ベストプラクティスをプッシュする機能を提供することにもっと集中していないのですか?

オブジェクト初期化子が導入されたのは、Linq に必要だったためだと思います。それらなしでは匿名型を作成できませんでした。自動プロパティに関しては、それほど重要ではありませんが、おそらく実装が簡単で、フィールドをカプセル化するだけのプロパティの場合、時間を大幅に節約できます。

于 2010-09-04T00:39:29.347 に答える