2

C# の詳細については、Jon Skeetが操作のオーバーロードIEquatable<>オーバーライドEquals()するために使用しています。

public sealed class Pair<T1, T2> : IEquatable<Pair<T1, T2>>
{
    public bool Equals(Pair<T1, T2> other)
    {
       //...
    }
}

彼は、「不要な実行時のチェックを回避する、厳密に型指定された API を提供するため」にこれを行っていると述べています。

どの実行時間チェックが回避されますか? さらに重要なことは、インターフェイスを実装すると、厳密に型指定された API をどのように実現できるのでしょうか?

本の文脈で何かを見逃したかもしれません。インターフェイスは、ポリモーフィズムによってコードを再利用できると考えていました。また、具象型ではなく抽象化へのプログラミングに適していることも理解しています。それが私が知っているすべてです。

4

5 に答える 5

5

デフォルトのEqualsメソッドobjectパラメータとして を受け取ります。したがって、このメソッドを実装するときは、コードで実行時チェックを行って、このオブジェクトがタイプであることを確認する必要がありPairます (これら 2 つを比較する前に)。

public override bool Equals(Object obj) {
    // runtime type check here
    var otherPair = obj as Pair<T1, T2>;
    if (otherPair == null)
        return false;

    // comparison code here
    ...
}

ただし、のEqualsメソッドは型パラメータとして a を取ります。したがって、実装でのチェックを回避して、より効率的にすることができます。IEquatable<T>Pair<T1,T2>

public bool Equals(Pair<T1, T2> other)    
{    
    // comparison code here
    ...
}    

Dictionary<TKey, TValue>List<T>、およびなどのクラスは、可能であれば要素の代わりにLinkedList<T> 使用するのに十分スマートです ( MSDNを参照)。IEquatable<T>.Equalsobject.Equals

于 2012-05-03T13:19:08.467 に答える
3

この場合、彼は の強く型付けされたバージョンを提供してObject.Equalsいます。これは、次のようなコードを置き換えます。

public override bool Equals(object other)
{
    // The following type check is not needed with IEquatable<Pair<T1, T2>>
    Pair<T1, T2> pair = other as Pair<T1, T2>;
    if (pair != null)
    {
        // <-- IEquatable<Pair<T1, T2>> implementation
    }
    else
    {
        return base.Equals(other);
    }
}
于 2012-05-03T13:19:21.357 に答える
2

インターフェースは、メソッドのIEquatable<T>厳密に型指定された実装を提供します。EqualsEqualsSystem.ObjectSystem.Object

于 2012-05-03T13:19:11.183 に答える
0

Skeet に公平を期すために (彼はすぐに参加することは間違いありませんが)、セクション 2.2.1 で「強い型付け」が何を意味するかについて議論することに時間を費やしています。

あなたの質問(私の版の85ページ)の文脈では、彼はデフォルトのEqualsメソッド(オブジェクトを引数として取る)が、インターフェースを実装する厳密に型指定されたEqualsメソッドに従うことを意味していると思います。

于 2012-05-03T13:27:25.020 に答える
0

Jonが「強く型付けされた」と言っているのは、ジェネリックについて語っていると思います。

非汎用IEquitableインターフェースは見つかりませんでしたが、IComparable<T>存在IComparableします。

于 2012-05-03T13:17:17.800 に答える