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

本文关键字:结构 简单 类型 | 更新日期: 2023-09-27 18:28:12

在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

我理解上述概念。我的问题是,考虑到上面的场景,在这样简单的情况下使用structs而不是类是个好主意吗?我经常看到人们在这种情况下实现类(例如简单的DTO),并做所有额外的事情来实现相等运算符(例如IEquatable和重写的equals方法)。

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

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

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

MSDN中有一整篇关于这方面的文章。

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

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

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

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

相关:

什么时候使用结构而不是类?