ホームページ > バックエンド開発 > C++ > .NET で参照型を最適に比較するにはどうすればよいですか?

.NET で参照型を最適に比較するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-07 17:51:40
オリジナル
231 人が閲覧しました

How to Best Compare Reference Types in .NET?

.NET 参照型比較のベスト プラクティス

.NET で参照型を比較す​​る場合、参照の同等性と値の同等性の違いを理解することが重要です。参照の等価性は 2 つの参照が同じオブジェクトを指しているかどうかをチェックし、値の等価性はオブジェクトが同じデータを持っているかどうかをチェックします。

等価演算子 (==) と Equals メソッドをオーバーライドします

型が値のセマンティクス (つまり、データに基づいて等しいとみなされる不変オブジェクト) を表現しない限り、参照型を比較す​​るために等価演算子 (==) や Equals メソッドをオーバーライドすることはお勧めできません。この場合、System.IEquatable インターフェイスと 3 つの演算子 (Equals、GetHashCode、および ==/!=) の実装を検討してください。

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 と 3 つの等価演算子 (Equals、GetHashCode、==/!=) をすべて実装します。可変値を表す参照クラスの場合は、==/!= 演算子をオーバーライドしないでください。デフォルトの動作を使用してオブジェクトのアイデンティティを確認します。

以上が.NET で参照型を最適に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート