.NET で参照型を比較する場合、参照の同等性と値の同等性の違いを理解することが重要です。参照の等価性は 2 つの参照が同じオブジェクトを指しているかどうかをチェックし、値の等価性はオブジェクトが同じデータを持っているかどうかをチェックします。
等価演算子 (==) と Equals メソッドをオーバーライドします
型が値のセマンティクス (つまり、データに基づいて等しいとみなされる不変オブジェクト) を表現しない限り、参照型を比較するために等価演算子 (==) や Equals メソッドをオーバーライドすることはお勧めできません。この場合、System.IEquatable
IEquatable インターフェイス
参照型が値のセマンティクスを表す場合は、System.IEquatable
IComparable インターフェイス
IComparable は主に、参照型ではなく値型で使用するように設計されています。参照型と一緒に使用することは避けてください。
カスタム比較
等価演算子をオーバーライドしたり IComparable を実装したりする代わりに、参照型を比較するカスタム メソッドを作成することを検討してください。 Equals メソッドを使用してオブジェクト ID を確認し、それをオーバーライドして関連プロパティを比較します。
等しい値の例
以下は、Point クラスの値の等価性を実装する例です:
<code class="language-csharp">class Point : IEquatable<Point> { public int X { get; } public int Y { get; } public Point(int x = 0, int y = 0) { X = x; Y = y; } public bool Equals(Point other) { if (other is null) return false; return X.Equals(other.X) && Y.Equals(other.Y); } public override bool Equals(object obj) => Equals(obj as Point); public static bool operator ==(Point lhs, Point rhs) => object.Equals(lhs, rhs); public static bool operator !=(Point lhs, Point rhs) => !(lhs == rhs); public override int GetHashCode() => HashCode.Combine(X, Y); }</code>
結論
値セマンティクスを持つ参照型の場合は、System.IEquatable
以上が.NET で参照型を最適に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。