为什么匿名类型的Equals实现比较字段? [英] Why does the Equals implementation for anonymous types compare fields?
问题描述
我只是想知道为什么语言的设计师决定在匿名类型上实现Equals类似于在值类型上实现 Equals
。
I'm just wondering why designers of the language decided to implement Equals on anonymous types similarly to Equals
on value types. Isn't it misleading?
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public static void ProofThatAnonymousTypesEqualsComparesBackingFields()
{
var personOne = new { Name = "Paweł", Age = 18 };
var personTwo = new { Name = "Paweł", Age = 18 };
Console.WriteLine(personOne == personTwo); // false
Console.WriteLine(personOne.Equals(personTwo)); // true
Console.WriteLine(Object.ReferenceEquals(personOne, personTwo)); // false
var personaOne = new Person { Name = "Paweł", Age = 11 };
var personaTwo = new Person { Name = "Paweł", Age = 11 };
Console.WriteLine(personaOne == personaTwo); // false
Console.WriteLine(personaOne.Equals(personaTwo)); // false
Console.WriteLine(Object.ReferenceEquals(personaOne, personaTwo)); // false
}
乍一看,所有打印的布尔值都应该为false。但是,当使用 Person
类型并使用匿名类型时,具有 Equals
调用的行将返回不同的值。
At first glance, all printed boolean values should be false. But lines with Equals
calls return different values when Person
type is used, and anonymous type is used.
推荐答案
匿名类型实例是不具有行为或身份的不可变数据值。参照比较它们没有多大意义。在这种情况下,我认为为它们生成结构相等比较是完全合理的。
Anonymous type instances are immutable data values without behavior or identity. It doesn't make much sense to reference-compare them. In that context I think it is entirely reasonable to generate structural equality comparisons for them.
如果您想将比较行为切换为自定义方式(引用比较或不区分大小写) ),则可以使用Resharper将匿名类型转换为命名类。 Resharper也可以生成相等成员。
If you want to switch the comparison behavior to something custom (reference comparison or case-insensitivity) you can use Resharper to convert the anonymous type to a named class. Resharper can also generate equality members.
这样做还有一个很实际的原因:匿名类型在LINQ连接和分组中可以方便地用作哈希键。因此,他们需要语义上正确的 Equals
和 GetHashCode
实现。
There is also a very practical reason to do this: Anonymous types are convenient to use as hash keys in LINQ joins and groupings. For that reason they require semantically correct Equals
and GetHashCode
implementations.
这篇关于为什么匿名类型的Equals实现比较字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!