Readonly struct vs classes

use*_*177 29 .net c#

假设您只有不可变类型,并且您的所有代码都是最新的C#7.3,并且您的方法正在使用in关键字进行输入

为什么你会使用类而不是readonly结构?

使用结构的缺点是复制是昂贵的,但假设您阻止任何副本(防御性编译器副本或由代码表示),readonly结构允许您只复制引用(如类所做)并避免堆分配和对垃圾的压力集电极.

排除特殊情况(我猜它可能是一个非常大的对象,不适合堆栈)你会使用readonly struct作为首选吗?

我感兴趣的案例是它们被用作数据容器的地方.

Mar*_*ell 42

结构不应该被视为"廉价物品"; 它们具有相似的特征集,这些特征集在某些区域中重叠并且在其他区域中不相交.例如:

  • 结构不能参与多态性
  • 你不能将一个结构视为一个接口的实例而不用它来装箱(警告:"约束调用",但这只适用于某些场景)
  • 许多库API 不能很好地(或者可能根本)使用结构 - 他们期望可变的POCO; 你可能想要使用一个库来从数据库中获取数据,将其序列化,或者在UI中呈现它 - 所有这些东西都会结构化
  • 结构对某些模式不能很好地工作,例如树或兄弟关系(如果它是结构,则Foo不能包含a Foo) - 还有其他模式
  • 结构和一般的不可变类型可能很难处理

另外,请注意,直到最近("ref return"和"ref locals"),很难实现"readonly结构允许你只复制引用"的某些部分; 现在这简单得多了.

但坦率地说,在大多数情况下,POCO 更容易使用,并且适用于大多数应用程序代码方案.

当然,结构是一个惊人的选择.它不是每次都有.但是,我支持这样一种观念,即如果你打算使用a struct,它应该是readonly struct(默认情况下)或者ref struct(如果你知道你为什么要这样做); 可变的非ref结构是疼痛的一种方法.