在C#中,如果我使用如下所示的结构并进行相等比较,则会比较结构字段的值,如果所有字段具有相同的值,我将得到结果为真。这是默认行为。
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方法)。
我的理解是正确还是我在这里遗漏了什么?
答案 0 :(得分:1)
在MSDN中有一篇关于此内容的文章。
✓如果类型的实例很小并且通常是短暂的或通常嵌入在其他对象中,则CONSIDER定义结构而不是类。
X AVOID定义结构,除非该类型具有以下所有特征:
在所有其他情况下,您应该将类型定义为类。
相关:
答案 1 :(得分:1)
您应该避免结构的相等的默认实现。如果你的结构包含引用类型字段(如PersonStruct
那样),那么反射用于比较相应字段的相等性,这相对较慢。您还应该为结构实现IEquatable<T>
,因为调用object.Equals(object)
方法将导致对源和参数结构进行装箱。如果可以将呼叫解析为IEquatable<PersonStruct>
,则可以避免这种情况。