假设你只有不可变类型,并且你的代码已更新到 C# 7.3 版本,而且你的方法使用 in
关键字来作为输入参数,那么你为什么还要使用类而不是只使用只读结构体呢?
使用结构体的缺点是复制操作代价高昂,但是如果你防止任何复制(通过编译器保护性复制或代码中显式表示),只读结构体允许你只复制引用(与类相同),避免在堆上分配内存并减轻垃圾回收器的压力。
除了特殊情况(比如可能不适合放在栈上的非常大的对象),你通常会将只读结构体作为第一选择吗?
我感兴趣的是它们作为数据容器的情况。
structs不应被看作“廉价对象”;它们具有类似的功能集,这些功能在某些方面重叠,在其他方面则是分离的。例如:
Foo
不能包含Foo
)-还有其他模式此外,请注意,直到最近(“ref返回”和“ref本地变量”),很难实现“readonly structs allow you to only copy the reference”的某些部分;现在这已经简单多了。
但坦白说,在大多数情况下,POCOs更容易使用,并且对于大多数应用程序代码场景都很好。
有时候,结构体确实是一个很好的选择。但并不是每次都是这样。我认为,如果你要使用struct
,它应该要么是一个readonly struct
(默认情况下),要么是一个ref struct
(如果你知道为什么要这样做);可变的非ref
结构体会导致痛苦。
List<T>
这样的东西中时,它没有“ref return”API(也不能明智地这样做,因为如果有人调用Add
并强制底层数组增长,人们会期望ref
指向活动数组,但现有的ref
实际上是内部指针进入旧数组)。这意味着您不能只是执行myRef = myRef.WithSomeChangedProperty("foo");
(以覆盖该值)。 - Marc Gravell
struct
或class
。 - Damien_The_Unbeliever5
都是相同的)。类代表对象。它们具有固有的“身份”,不是其包含数据的一部分。即使您有两个具有相同数据的实例,对于某些考虑方式来说它们也不是“相同的”。 - Damien_The_UnbelieverReferenceEquals
来区分它们 :-) - Damien_The_Unbeliever