1

リンク:

• 型のセマンティクスが、型が何らかの値を表すという事実に基づいている場合は、参照型で Equals をオーバーライドすることを検討してください。

• ほとんどの参照型は、Equals をオーバーライドする場合でも、等価演算子をオーバーロードしてはなりません。ただし、複素数型など、値のセマンティクスを持つことを目的とした参照型を実装している場合は、等値演算子をオーバーライドする必要があります。

a) 私の理解では、参照型の異なるインスタンスを交換可能にするには、Equalsメソッドとの両方をオーバーライドequality operatorし、型を不変にする必要がありますか?

b)値セマンティクスを持つ参照型は、その型の異なるインスタンス (同じ値を表す) が交換可能であることを示唆していませんか?

c) しかし、上記の引用によると、値のセマンティクスを持つ特定の参照型Equalsでは、オーバーライドされたメソッドのみが必要であり、equality operator. そのような型のインスタンスは明らかに交換可能ではないのに、そのような型には値のセマンティクスがあるとどのように主張できるでしょうか?

d) では、どのような基準に基づいて、値セマンティクスを持つ参照型Equalsがそのメソッドのみをオーバーライドするか、それともオーバーライドする必要があるかを決定しequality operatorます。単純に、型を不変にするかどうかに基づいていますか?

ありがとう

4

1 に答える 1

2

ポイントAに関しては、はい、型は不変でなければなりません。MSDNから:

変更可能な参照型で Equals をオーバーライドしないでください。

ここでの中心的な問題は D だと思います。フレームワークの設計ガイドラインは、これがパフォーマンスに帰着することを示しているようです。

実装が参照等価の実装よりも大幅に遅くなる場合は、参照型で等価演算子をオーバーロードしないようにします。

Eric Lippert は、これについて興味深いことをここで述べています。それからの私のお気に入りの引用は次のとおりです。

長い答えは、全体が奇妙であり、どちらも理想的な方法で機能しないということです.

個人的には、「==」は機能的には Equals() の読み取り可能な省略形であるという意見を常に持っていたので、これで安堵のため息をつくことができます (そうではないことはわかっていますが)。

于 2013-08-20T17:54:58.760 に答える