C# 对于引用类型,如何使用IEquatable<;T>;减少铸件的使用?
我在几篇文章中读到 对于参考类型,使用IEquatable可以减少强制转换的使用C# 对于引用类型,如何使用IEquatable<;T>;减少铸件的使用?,c#,casting,iequatable,C#,Casting,Iequatable,我在几篇文章中读到 对于参考类型,使用IEquatable可以减少强制转换的使用 有谁能提供一个令人信服的例子。我相信你的答案就在这里。阅读页面上的备注部分。你知道吗? 上面说 如果希望有自己的实现,可以重写此方法。由于Equals方法有一个Object类型的参数,因此需要强制转换才能访问特定于类的成员 这就是IEquatable接口的用武之地。IEquatable是.NET 2.0中的一个新通用接口,它允许您执行与System.Object.Equals方法相同的操作,但不必执行强制转换。因此
有谁能提供一个令人信服的例子。我相信你的答案就在这里。阅读页面上的备注部分。你知道吗? 上面说 如果希望有自己的实现,可以重写此方法。由于Equals方法有一个Object类型的参数,因此需要强制转换才能访问特定于类的成员 这就是IEquatable接口的用武之地。IEquatable是.NET 2.0中的一个新通用接口,它允许您执行与System.Object.Equals方法相同的操作,但不必执行强制转换。因此,在实现此接口时,可以减少强制转换的数量,这对性能是一件好事。特别是在大量使用泛型集合时,因为泛型集合在其某些方法(List.Equals()、List.IndexOf()、List.LastIndexOf()、…)中使用了这种相等比较
由于其泛型类型参数,
IEquatable
可以在编译时提供类型检查,因此您不必强制转换和后期绑定object
s.只需在以下内容之后添加一个简单示例:
班级人员:可胜任
{
公共字符串名称{get;set;}
公共覆盖布尔等于(对象对象对象)
{
如果(obj是个人)
{
人员其他=(人员)obj;
//检查平等性
}
返回基数等于(obj);
}
#区域可容纳成员
公共布尔等于(其他人)
{
//无需强制转换即可检查相等性
}
#端区
}
注意:这只是一个小片段,说明了为什么这样做可以避免强制转换
。要获得正确的实施,请检查:
如果实现IEquatable),还应覆盖
的基类实现
对象..::.Equals(对象)和
GetHashCode,以便它们的行为
与美国的情况一致
IEquatable)::。等于
方法
您可以从类定义中删除IEquatable,方法仍将以相同的方式工作。所以我看不出IEquatable本身如何减少这里的施法。救命啊!例如,如果您实现的某种集合预期包含许多项,那么性能是一个重要因素。在这种情况下,您可以请求您的所有项实现提供稍好性能的IEquatable。这样,可以被称为数万亿次的重要比较方法至少可以避免每次比较中的等号。@Bruno:我明白了!我快速浏览了一下列表。这将创建一个比较器,如果类型实现了IEquatable,它将使用IEquatable的实现。谢谢,你帮了我很大的忙!Nickyt的帖子也帮助我了解了这一点。谢谢大家!请注意,应该只为结构或密封类类型实现
IEquatable
。当用于结构时,它可以带来巨大的性能优势,而对于密封类型,它的优势较小。它不应该与未密封的类型一起使用,因为使它与重写对象.Equals的派生类型正确工作的唯一方法是让IEquatable的实现。Equals(T)
调用虚拟对象.Equals(Object)
方法,这是在没有它的情况下会发生的。@Dario:C不是早绑定的吗,除非您使用dynamic?虽然这在理论上可以回答问题,但请在此处包含答案的基本部分,并提供链接以供参考。
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
}