2

私はいくつかの記事で読んだことがあります

IEquatable を使用した参照型の場合、キャストの使用を減らす

誰かが説得力のある例を親切に提供できますか。

4

3 に答える 3

2

ダリオの説明の後に簡単な例を追加するだけです:

class Person : IEquatable<Person>
{
    public string Name { get; set; }

    public override bool Equals(object obj)
    {
        if (obj is Person)
        {
            Person other = (Person)obj;
            // check equality
        }
        return base.Equals(obj);
    }

    #region IEquatable<Person> Members

    public bool Equals(Person other)
    {
        // check equality without cast
    }

    #endregion
}

注: これは、これがcast. 正しい実装については、ドキュメントを確認してください。

IEquatable<(Of <(T>)>) を実装する場合は、Object..::.Equals(Object) および GetHashCode の基本クラスの実装もオーバーライドして、それらの動作が IEquatable<(Of の動作と一致するようにします。 <(T>)>)..::.Equals メソッド

于 2009-05-20T16:39:30.567 に答える
1

この記事を知っていますか?それは言う

独自の実装が必要な場合は、このメソッドをオーバーライドできます。EqualsメソッドにはObject型のパラメーターがあるため、クラス固有のメンバーにアクセスできるようにするには、キャストが必要になります。

ここでIEquatableインターフェイスが登場します。IEquatableは.NET2.0の新しい汎用インターフェイスであり、System.Object.Equalsメソッドと同じことを実行できますが、キャストを実行する必要はありません。したがって、このインターフェイスを実装すると、キャストの数を減らすことができます。これは、パフォーマンスにとって良いことです。特にジェネリックコレクションで多くの作業を行う場合、ジェネリックコレクションは一部のメソッド(List.Equals()、List.IndexOf()、List.LastIndexOf()、...)でこの等式比較を利用するためです。

ジェネリック型パラメーターにより、IEquatable<T>コンパイル時に型チェックを提供できるため、sをキャストして遅延バインディングする必要はありませんobject

于 2009-05-20T16:34:28.440 に答える
0

あなたの答えはここにあると思います、http://msdn.microsoft.com/en-us/library/ms131190.aspx。ページの備考欄をお読みください。

于 2009-05-20T16:31:41.003 に答える