什么时候应该在C#中使用struct而不是class?我的概念模型是当项只是值类型的集合时使用结构.一种逻辑上将它们组合在一起形成一个有凝聚力的整体的方法.
我在这里遇到了这些规则:
这些规则有效吗?结构在语义上意味着什么?
是否所有CLR值类型(包括用户定义的structs)都独立地存在于评估堆栈中,这意味着它们永远不需要被垃圾收集器回收,或者是否存在垃圾收集的情况?
我之前已经问过一个关于流畅的接口对.NET应用程序的运行时性能的影响的问题.我特别担心创建大量非常短暂的临时对象会通过更频繁的垃圾收集对运行时性能产生负面影响.
现在我已经知道,如果我将这些临时对象的类型声明为struct(即用户定义的值类型)而不是class,如果事实证明所有值类型都只存在于垃圾收集器上,则可能根本不涉及垃圾收集器.评估堆栈.
(这对我来说主要是因为我在考虑C++处理局部变量的方式.通常是自动(auto)变量,它们被分配在堆栈上,因此当程序执行回到调用者时释放 - 没有动态内存管理通过new/ delete参与其中.我认为CLR 可能会处理struct类似的问题.)
我做了一个简短的实验,看看为用户定义的值类型和引用类型生成的CIL有什么不同.这是我的C#代码:
struct SomeValueType { public int X; }
class SomeReferenceType { public int X; }
.
.
static void TryValueType(SomeValueType vt) { ... }
static void TryReferenceType(SomeReferenceType rt) { ... }
.
.
var vt = new SomeValueType { X = 1 };
var rt = new SomeReferenceType { X = …Run Code Online (Sandbox Code Playgroud)