相关疑难解决方法(0)

何时使用struct?

什么时候应该在C#中使用struct而不是class?我的概念模型是当项只是值类型的集合时使用结构.一种逻辑上将它们组合在一起形成一个有凝聚力的整体的方法.

我在这里遇到了这些规则:

  • 结构应该表示单个值.
  • 结构应具有小于16个字节的内存占用.
  • 创建后不应更改结构.

这些规则有效吗?结构在语义上意味着什么?

c# struct

1347
推荐指数
23
解决办法
26万
查看次数

CLR(.NET)如何在内部分配和传递自定义值类型(结构)?

题:

是否所有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)

.net clr garbage-collection memory-management value-type

6
推荐指数
2
解决办法
1895
查看次数