在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?
我可能在书的背景下遗漏了一些东西.我认为接口通过多态性让我们重用代码.我也理解它们适合编程为抽象而不是具体类型.这就是我所知道的.
默认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).
| 归档时间: |
|
| 查看次数: |
631 次 |
| 最近记录: |