gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:47:16 24 4
gpt4 key购买 nike

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

乍一看,所有打印的 bool 值都应该是假的。但是当使用 Person 类型和使用匿名类型时,带有 Equals 调用的行返回不同的值。

最佳答案

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

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

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

关于c# - 为什么匿名类型的 Equals 实现会比较字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12123512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com