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

我只是想知道为什么语言的设计师决定在匿名类型上实现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并使用匿名类型时,带有调用的行将返回不同的值。


犯罪嫌疑人X
浏览 372回答 3
3回答

慕虎7371278

匿名类型实例是没有行为或身份的不可变数据值。参照比较它们没有多大意义。在这种情况下,我认为为它们进行结构相等比较是完全合理的。如果要将比较行为切换为自定义方式(引用比较或不区分大小写),则可以使用Resharper将匿名类型转换为命名类。Resharper还可以生成平等成员。这样做还有一个非常实际的原因:匿名类型在LINQ连接和分组中可以方便地用作哈希键。出于这个原因,他们需要语义正确Equals和GetHashCode实现。

牛魔王的故事

至于为什么要问语言设计师呢?但是我在埃里克·利珀特(Eric Lippert)的文章《关于在程序集中统一匿名类型的文章》(第二部分)中找到了这一点匿名类型为您提供了一个方便的位置来存储少量不可变的名称/值对,但是它给您带来了更多好处。它还为您提供了Equals,GetHashCode的实现,并且与本次讨论最紧密的是ToString。(*)注释中为什么会出现以下内容:(*)我们为您提供Equals和GetHashCode,以便您可以在LINQ查询中使用匿名类型的实例作为执行连接的键。由于性能原因,LINQ to Objects使用哈希表实现联接,因此,我们需要Equals和GetHashCode的正确实现。
打开App,查看更多内容
随时随地看视频慕课网APP