对简单类型使用结构而不是类
本文关键字:结构 简单 类型 | 更新日期: 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字节
- 它是不可变的
- 它不必经常装箱
在所有其他情况下,您应该将类型定义为类
相关:
什么时候使用结构而不是类?