实现接口如何为我们提供强类型API?

P.B*_*key 1 c#

在C#中的深度,乔恩斯基特使用IEquatable<>覆盖过载Equals()操作.

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

他说我们这样做是为了"提供一个强类型的API,以避免不必要的执行时间检查".

哪些执行时间检查可以避免?更重要的是,实现接口如何实现强类型API?

我可能在书的背景下遗漏了一些东西.我认为接口通过多态性让我们重用代码.我也理解它们适合编程为抽象而不是具体类型.这就是我所知道的.

Hei*_*nzi 5

默认Equals方法采用a object作为参数.因此,在实现此方法时,您必须在代码中进行运行时检查以确保此对象的类型Pair(在比较这两者之前):

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
    ...
}
Run Code Online (Sandbox Code Playgroud)

然而,该Equals方法IEquatable<T>将a Pair<T1,T2>作为类型参数.因此,您可以避免检查您的实现,从而提高效率:

public bool Equals(Pair<T1, T2> other)    
{    
    // comparison code here
    ...
}    
Run Code Online (Sandbox Code Playgroud)

Dictionary<TKey, TValue>(List<T>和)这样的类LinkedList<T> 很聪明,可以使用它们IEquatable<T>.Equals而不是object.Equals它们的元素(如果可用)(参见MSDN).