我有一个结构
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对于结构而不对类有效?
答案 0 :(得分:4)
对于结构(值类型),Equals
比较结构的整个值,即所有字段。
object.Equals()
(对于类)的默认实现会进行引用比较。它比较两个引用是否“指向”类的同一实例,但不比较实例的内容。
因此,如果其中一个属性是对象,则结构比较将无法进行,例如
List<int>
?
它确实可以“工作”,但可能并非您期望的那样。它不会比较列表的内容,它只会检查属性是否引用了相同的列表实例。
如果您想对它们进行深入比较,则需要覆盖Equals
并自己实现。
但是请注意,它可以与string
一起使用,因为在比较属性时,将调用这些属性的Equals
方法,并且将string.Equals()
覆盖以比较字符串内容。