c# - 不可变类与结构

标签 c# class struct immutability

以下是 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/

相关文章:

c# - 如何将字符样式应用于字处理文档中的运行?

javascript - zClip 不起作用 - 多次复制到剪贴板 JS

c - 我应该如何分配我的结构(指向结构数组的指针)?

c - 动态分配的结构数组中的段错误,C

c++ - 如何基于函数参数C++更改对象属性

c# - 将 C# 接口(interface)/类传递给 F#

c# - 如何使用 C# 为新手检查已安装的浏览器

c# - MVC 4.5.2 Response.WriteFile 大于 2gb

class - haskell : Working with monad classes

c++ - 是否可以在 C++ 类声明中模板化类名?