结构如何实现等于

时间:2018-09-26 06:57:21

标签: c# class struct

我有一个结构

public struct item
{
    public int id { get; set; }
    public string name { get; set; }
}

如果我创建一个HashSet<item>并添加两个相等的项,则第二个不会插入,因为它已经存在(相等似乎抛出相同的值)

HashSet<item> hsi = new HashSet<item>();
Console.WriteLine(hsi.Add(new item() { id = 1, name = "test" })); //true
Console.WriteLine(hsi.Add(new item() { id = 1, name = "test" })); //false - expected result

现在如果我将struct更改为class

public class item //changed struct to class
{
    public int id { get; set; }
    public string name { get; set; }
}

结果是

HashSet<item> hsi = new HashSet<item>();
Console.WriteLine(hsi.Add(new item() { id = 1, name = "test" })); //true
Console.WriteLine(hsi.Add(new item() { id = 1, name = "test" })); //true

问题:为什么equals对于结构而不对类有效?

1 个答案:

答案 0 :(得分:4)

对于结构(值类型),Equals比较结构的整个值,即所有字段。

object.Equals()(对于类)的默认实现会进行引用比较。它比较两个引用是否“指向”类的同一实例,但不比较实例的内容


  

因此,如果其中一个属性是对象,则结构比较将无法进行,例如List<int>

它确实可以“工作”,但可能并非您期望的那样。它不会比较列表的内容,它只会检查属性是否引用了相同的列表实例。
如果您想对它们进行深入比较,则需要覆盖Equals并自己实现。

但是请注意,它可以与string一起使用,因为在比较属性时,将调用这些属性的Equals方法,并且将string.Equals()覆盖以比较字符串内容。