对于简单类型,使用结构而不是类

时间:2015-12-25 12:37:44

标签: c# .net struct equality

在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方法)。

我的理解是正确还是我在这里遗漏了什么?

2 个答案:

答案 0 :(得分:1)

MSDN中有一篇关于此内容的文章。

✓如果类型的实例很小并且通常是短暂的或通常嵌入在其他对象中,则CONSIDER定义结构而不是类。

X AVOID定义结构,除非该类型具有以下所有特征:

  • 它逻辑上表示单个值,类似于原始类型(int,double等)。
  • 实例大小小于16个字节。
  • 这是不可改变的。
  • 不必频繁装箱。

在所有其他情况下,您应该将类​​型定义为类。

相关:

When do you use a struct instead of a class?

答案 1 :(得分:1)

您应该避免结构的相等的默认实现。如果你的结构包含引用类型字段(如PersonStruct那样),那么反射用于比较相应字段的相等性,这相对较慢。您还应该为结构实现IEquatable<T>,因为调用object.Equals(object)方法将导致对源和参数结构进行装箱。如果可以将呼叫解析为IEquatable<PersonStruct>,则可以避免这种情况。