Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对简单类型使用结构而不是类_C#_.net_Struct_Equality - Fatal编程技术网

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

C# 对简单类型使用结构而不是类,c#,.net,struct,equality,C#,.net,Struct,Equality,在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

在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
我理解上面的概念。我的问题是考虑到上面的场景,在这样简单的情况下使用结构而不是类是一个好主意吗?我经常看到人们在这种情况下实现类(例如,简单DTO),并执行所有额外的操作来实现相等运算符(例如IEquatable和重写的equals方法)


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

这本书有一整篇关于这方面的文章

✓ 如果类型的实例很小,通常是短命的,或者通常嵌入在其他对象中,请考虑定义结构而不是类。 避免定义结构,除非该类型具有以下所有特征:

  • 它在逻辑上表示单个值,类似于基本类型(int、double等)
  • 它的实例大小小于16字节
  • 它是不变的
  • 它不必经常装箱
在所有其他情况下,您应该将类型定义为类。

相关的:


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

系统的默认相等实现,则可以避免这种情况。ValueType使用反射,效率相对较低。因此,无论如何,您都应该为结构和类实现
IEquatable
。对于结构来说,更重要的是避免调用
object.Equals
时出现的装箱。您应该使结构不可变。这是一条经验法则。不过,还有其他一些,我和国际海事组织也同样可信。参见比尔·瓦格纳的有效C#ch.2,第18项,第104-110页!引用:.NET的文档建议您将类型的大小视为决定因素。实际上,更好的因素是类型的使用。我认为大小限制的考虑因素是,当结构用作参数时,它们是按值传递的,当有许多方法调用时,这可能会导致问题@陶