对于引用类型,如何使用IEquatable <t>来减少使用强制转换?</t>

时间:2009-05-20 16:26:26

标签: c# casting iequatable

我读过几篇文章

使用IEquatable的参考类型减少了投射的使用

有人可以提供令人信服的例子。

3 个答案:

答案 0 :(得分:2)

只需在Dario's explanation之后添加一个简单示例:

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。要获得正确的实施,请检查docs

  

如果你实现IEquatable&lt;(Of   &lt;(T&gt;)&gt;),你也应该覆盖   基类实现   Object .. ::。Equals(Object)和   GetHashCode以便他们的行为   与那个一致   IEquatable&lt;(Of&lt;(T&gt;)&gt;).. ::。Equals   方法

答案 1 :(得分:1)

你知道this article吗? 它说

  

如果您想拥有自己的实现,可以覆盖此方法。由于Equals方法具有Object类型的参数,因此需要进行强制转换才能访问特定于类的成员。

     

这是IEquatable接口的用武之地.IEququable是.NET 2.0中的一个新的通用接口,它允许您像System.Object.Equals方法一样执行,但不必执行强制转换。因此,在实现此接口时,您可以减少强制转换的数量,这对性能来说是一件好事。特别是在使用泛型集合时,通用集合在其某些方法(List.Equals(),List.IndexOf(),List.LastIndexOf(),...)中使用了这种相等比较。

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

答案 2 :(得分:0)

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