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 是 .NET 2.0 中的一个新通用接口,它允许您执行与 System.Object.Equals 方法相同的操作,但不必执行强制转换。所以,在实现这个接口的时候,可以减少强制转换的次数,这对性能来说是一件好事。尤其是在大量使用泛型集合时,因为泛型集合在其某些方法(List.Equals()、List.IndexOf()、List.LastIndexOf()、...)中使用了这种相等比较。

由于其泛型类型参数,IEquatable<T>可以在编译时提供类型检查,因此您不必使用objects 进行强制转换和后期绑定。

于 2009-05-20T16:34:28.440 回答
0

我相信你的答案在这里, http: //msdn.microsoft.com/en-us/library/ms131190.aspx。阅读页面上的备注部分。

于 2009-05-20T16:31:41.003 回答