以下是 C# 中类与结构的唯一不同之处(如果我错了请纠正我):
- 类变量是引用,而结构变量是值,因此结构的整个值在赋值和参数传递中被复制
- 类变量是存储在堆栈上的指针,指向堆上的内存,而结构变量作为值存储在堆上
假设我有一个不可变结构,它的字段一旦初始化就不能修改。每次我将此结构作为参数传递或在赋值中使用时,该值都会被复制并存储在堆栈中。
然后假设我使这个不可变结构成为一个不可变类。此类的单个实例将被创建一次,并且在赋值和参数传递中只会复制对该类的引用。
如果对象是可变的,这两种情况下的行为会有所不同:当改变对象时,第一种情况下结构的副本将被修改,而在第二种情况下原始对象将被更改.然而,在这两种情况下,对象都是不可变的,因此对于该对象的用户来说,这实际上是一个类还是一个结构没有区别。
既然复制引用比复制结构便宜,为什么要使用不可变结构?
此外,由于 mutable structs are evil ,看起来根本没有理由使用结构。
我哪里错了?
最佳答案
Since copying reference is cheaper than copying struct, why would one use an immutable struct?
这并不总是正确的。在 64 位操作系统上复制引用将占用 8 个字节,这可能比许多结构都大。
另请注意,创建类的成本可能更高。创建结构通常完全在堆栈上完成(虽然 there are many exceptions ),这是非常快的。创建类需要创建对象句柄(用于垃圾收集器)、在堆栈上创建引用并跟踪对象的生命周期。这会增加 GC 压力,这也会产生实际成本。
也就是说,创建一个大型 不可变结构可能不是一个好主意,这就是为什么 Guidelines for choosing between Classes and Structures 的部分原因。如果您的结构将超过 16 个字节,如果它被装箱,以及其他使差异变小的问题,建议始终使用类。
话虽这么说,但我的决定通常更多地基于相关类型的预期用途和含义。值类型应该用来指代单个值(同样,请引用指南),并且通常具有与类不同的语义含义和预期用法。在类或结构之间做出选择时,这通常与性能特征一样重要。
关于c# - 不可变类与结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147340/