我读过几篇文章
使用 IEquatable 的引用类型减少了强制转换的使用
有人可以提供一个令人信服的例子。
只是在达里奥的解释之后添加一个简单的例子:
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 方法
你知道这篇文章吗?它说
如果你想拥有自己的实现,你可以重写这个方法。由于 Equals 方法有一个 Object 类型的参数,因此需要进行强制转换才能访问特定于类的成员。
这就是 IEquatable 接口的用武之地。IEquatable 是 .NET 2.0 中的一个新通用接口,它允许您执行与 System.Object.Equals 方法相同的操作,但不必执行强制转换。所以,在实现这个接口的时候,可以减少强制转换的次数,这对性能来说是一件好事。尤其是在大量使用泛型集合时,因为泛型集合在其某些方法(List.Equals()、List.IndexOf()、List.LastIndexOf()、...)中使用了这种相等比较。
由于其泛型类型参数,IEquatable<T>
可以在编译时提供类型检查,因此您不必使用object
s 进行强制转换和后期绑定。
我相信你的答案在这里, http: //msdn.microsoft.com/en-us/library/ms131190.aspx。阅读页面上的备注部分。