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