C# 平等比较公司<;T>;。默认误解?
我有一个类C# 平等比较公司<;T>;。默认误解?,c#,.net-4.0,iequalitycomparer,C#,.net 4.0,Iequalitycomparer,我有一个类Person,它实现了IEquatable中的Equals()方法(还覆盖了对象。Equals方法,让我们暂时忽略GetHashcode()方法) 但是我是个程序员!我永远不会发送一个对象,而实际上它是一个人 我错过了什么?我很难理解EqualityComparer.Default的好处。有人能给我举个例子来证明我错了吗?如果您传入null作为第二个参数,或者如果您根本不传入第二个参数(基本相同),SequenceEquals的实现将调用EqualityComparer.Default
Person
,它实现了IEquatable
中的Equals()方法(还覆盖了对象。Equals
方法,让我们暂时忽略GetHashcode()方法)
但是我是个程序员!我永远不会发送一个对象
,而实际上它是一个人
我错过了什么?我很难理解
EqualityComparer.Default
的好处。有人能给我举个例子来证明我错了吗?如果您传入null
作为第二个参数,或者如果您根本不传入第二个参数(基本相同),SequenceEquals的实现将调用EqualityComparer.Default本身(可反编译枚举
)。这就解释了为什么无论是否提供EqualityComparer.Default
,您都看不出有什么区别
因此,最后,第二个参数只有在您希望使用除EqualityComparer.Default
之外的相等比较器时才有意义,您可以传入IEqualityComparer.Default
是的一个效果,添加在.NET 4中
本质上,只要需要IEqualityComparer
,就可以使用IEqualityComparer
,其中DerivedType:BaseType
。由于Person
源自Object
,这意味着只要需要IEqualityComparer
,就可以使用IEqualityComparer
。答案如下:
对于值类型,应始终实现IEquatable并重写Object.Equals(Object)以获得更好的性能。Equals框值类型,并依赖反射来比较两个值是否相等。Equals的实现和Object.Equals的重写都应该返回一致的结果
如果您不重写Equals和GetHashCode,EqualityComparer.Default实际上会为您解决这个问题。您不明白什么?实例化IEqualityComparer.Default
的好处,或者为什么您可以选择特定的实例化,或者其他什么?为什么它可以使用或不使用它,为什么我有理由用typeBoxing调用它只对值类型发生。由于Person
是一个引用类型,因此本例中不涉及装箱。@您不能执行的循环bool b=lst1.SequenceEqual(lst2,EqualityComparer.Default)代码>因为它需要:t源类型。来源是人。看起来对发生的事情有很大的误解。如果我们把它带到C#聊天室也许会更好…为什么我会用它来与它进行比较呢?你可能想实现你自己的iQualityComparer,例如,如果你用它来表示一个T,它没有按照你所需要的方式实现相等。我只被告知值类型-所以我想我必须构建一个我似乎不理解的结构。请详细说明您正在尝试执行的操作。这是因为它是反变的。当对象比较器是一个人时,我为什么要使用它?另外,我听说它有避免拳击的优点。哪种拳击?类似于:“如果你有Iequatable Equals方法,我将使用它,而不是Object.Equals方法”…这里是什么地方?在这个特定的例子中,通用的逆变法并没有那么有用,但是在某些情况下它确实非常有用。仅仅因为你能做某事并不意味着这样做是正确的。
class Person : IEquatable<Person>
{
public string Name { get; set; }
public bool Equals(Person other)
{
return this.Name == other.Name;
}
public override bool Equals(object obj)
{
var person = obj as Person;
return person != null && person.Name == Name;
}
}
Person p1 = new Person() { Name = "a" };
Person p2 = new Person() { Name = "a" };
List<Person> lst1 = new List<Person>() { p1 };
List<Person> lst2 = new List<Person>() { p2 };
bool b = lst1.SequenceEqual(lst2, EqualityComparer<Person>.Default);
EqualityComparer<Person>.Default
bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);