只读结构与类

时间:2018-08-14 08:07:34

标签: c# .net

假设您只有不可变的类型 并且您拥有所有最新的C#7.3代码,并且您的方法使用<label style="display: inline;color: #545454;font-weight:100;" dataid="' +this.ID +'" data-nodeid = "' +this.NodeId +'"><input type= "checkbox" style= "display:none;" id="cb' + this.ID + '">MILK <span for="cb' + this.ID +'" class="checkmark"></span > </label >关键字作为输入

为什么要使用类而不是只读结构?

使用结构的缺点是复制是昂贵的,但是假设您阻止任何复制(防御性编译器复制或由代码表示),则只读结构仅允许您复制引用(如类一样),避免堆分配和压力在垃圾收集器上。

不包括特殊情况(我猜这可能是一个非常大的对象,无法放入堆栈中),您通常将只读结构用作首选吗?

我感兴趣的情况是将它们用作数据容器。

1 个答案:

答案 0 :(得分:38)

结构不应被视为“廉价对象”;它们具有相似的功能集,在某些区域中重叠而在其他区域中不相交。例如:

  • 结构不能参与多态性
  • 如果不对结构进行装箱,就不能将其视为接口的实例(注意:“ constrained call”,但这仅在某些情况下有效)
  • 很多库API 不能很好地工作(或可能根本没有)与结构-他们期望可变的POCO;您可能想使用一个库从数据库中获取数据,对其进行序列化或在UI中进行渲染-所有这些事情都使结构变得有些困难
  • 结构不适用于某些模式,例如树或兄弟关系(Foo不能包含Foo(如果它是结构))-还有其他
  • 结构和通常不可变的类型可能很难使用

此外,请注意,直到最近(“ ref返回”和“ ref当地”),要实现“只读结构只允许您复制参考”的某些部分,还是非常困难的。现在,这要简单得多。

但是坦率地说,在大多数情况下,POCO都很容易使用,对于大多数应用程序代码情况也很合适。

当然,有时结构是一个了不起的选择。并非每次都这样。我但是,支持以下观点:如果您要使用struct,则应该是readonly struct(默认情况下)或ref struct (如果您知道为什么要这么做);可变的非ref结构是痛苦的秘诀。