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

Using structs instead of classes for simple types

在 C# 中,如果我使用如下所示的结构并进行相等比较,将比较该结构的字段的值,如果所有字段都具有相同的 value.This,我将得到一个结果 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

在 class 的情况下,同样的事情会 return 值 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

我理解上述 concept.My 问题是在考虑上述情况,在这种简单的情况下使用结构而不是 class 是个好主意吗?我经常看到人们在这种情况下实现 classes(例如简单的 DTO)并做所有额外的事情来实现相等运算符(例如 IEquatable 和覆盖的 equals 方法)。

我的理解是否正确,还是我遗漏了什么?

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

✓ 如果类型的实例很小且通常是短暂的或通常嵌入到其他对象中,请考虑定义一个结构而不是 class。

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

  • 它在逻辑上表示单个值,类似于基本类型(int、double 等)。
  • 实例大小小于 16 字节。
  • 它是不可变的。
  • 不用经常装箱

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

相关:

When do you use a struct instead of a class?

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

,则可以避免这种情况