在C#中,如果我使用下面所示的结构体并进行相等比较,则会比较结构体字段的值,如果所有字段具有相同的值,则会得到true结果。这是默认行为。
struct PersonStruct
{
public PersonStruct(string n,int a)
{
Name = n;Age = a;
}
public string Name { get; set; }
public int Age { get; set; }
}
var p1 = new PersonStruct("Jags", 1);
var p2 = new PersonStruct("Jags", 1);
Console.WriteLine(p1.Equals(p2)); //Return True
如果是类,它会返回false,因为类是引用类型。
class PersonClass
{
public PersonClass(string n, int a)
{
Name = n; Age = a;
}
public string Name { get; set; }
public int Age { get; set; }
}
var pc1 = new PersonClass("Jags", 1);
var pc2 = new PersonClass("Jags", 1);
Console.WriteLine(pc1.Equals(pc2));//Returns False
我了解上述概念。我的问题是,考虑到上述情况,使用结构体而不是类是否是一个好主意?我经常看到人们在这种情况下实现类(例如简单的DTO),并做所有额外的工作来实现相等运算符(如IEquatable和重写的equals方法)。
我的理解正确吗,还是我漏掉了什么?
System.ValueType
的默认相等性实现使用反射,效率相对较低。因此,您应该为您的结构体和类实现IEquatable<T>
。对于结构体来说,避免调用object.Equals
会更加重要,以避免装箱。 - Lee