为什么匿名类型的Equals实现比较字段? [英] Why does the Equals implementation for anonymous types compare fields?

查看:58
本文介绍了为什么匿名类型的Equals实现比较字段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只是想知道为什么语言的设计师决定在匿名类型上实现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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆