为了账号安全,请及时绑定邮箱和手机立即绑定

为什么匿名类型的Equals实现比较字段?

为什么匿名类型的Equals实现比较字段?

C#
犯罪嫌疑人X 2019-11-19 10:16:33
我只是想知道为什么语言的设计师决定在匿名类型上实现Equals的方式类似于Equals在值类型上实现。这不是误导吗?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。但是Equals当使用Persontype并使用匿名类型时,带有调用的行将返回不同的值。
查看完整描述

3 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

匿名类型实例是没有行为或身份的不可变数据值。参照比较它们没有多大意义。在这种情况下,我认为为它们进行结构相等比较是完全合理的。

如果要将比较行为切换为自定义方式(引用比较或不区分大小写),则可以使用Resharper将匿名类型转换为命名类。Resharper还可以生成平等成员。

这样做还有一个非常实际的原因:匿名类型在LINQ连接和分组中可以方便地用作哈希键。出于这个原因,他们需要语义正确EqualsGetHashCode实现。


查看完整回答
反对 回复 2019-11-19
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

至于为什么要问语言设计师呢?


但是我在埃里克·利珀特(Eric Lippert)的文章《关于在程序集中统一匿名类型的文章》(第二部分)中找到了这一点


匿名类型为您提供了一个方便的位置来存储少量不可变的名称/值对,但是它给您带来了更多好处。它还为您提供了Equals,GetHashCode的实现,并且与本次讨论最紧密的是ToString。(*)


注释中为什么会出现以下内容:


(*)我们为您提供Equals和GetHashCode,以便您可以在LINQ查询中使用匿名类型的实例作为执行连接的键。由于性能原因,LINQ to Objects使用哈希表实现联接,因此,我们需要Equals和GetHashCode的正确实现。


查看完整回答
反对 回复 2019-11-19
  • 3 回答
  • 0 关注
  • 380 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信