小编典典

结构与类

c#

我将在代码中创建100,000个对象。它们很小,只有2个或3个属性。我将它们放在通用列表中,当它们存在时,将循环它们并检查value
a,也许更新value b

将这些对象创建为类还是struct更快/更好?

编辑

一个。属性是值类型(除了我认为的字符串?)

b。他们可能(我们不确定)具有验证方法

编辑2

我想知道:垃圾回收器是否平等地处理了堆和堆栈上的对象,或者工作原理有所不同?


阅读 279

收藏
2020-05-19

共1个答案

小编典典

难道 更快 创建这些对象的类或结构?

您是唯一可以确定该问题答案的人。两种方法都尝试一下, 测量
有意义的,以用户为中心的相关性能指标,然后您将知道更改是否对相关场景中的实际用户产生了有意义的影响。

结构消耗更少的堆内存(因为它们 更小
且更易于压缩,而不是因为它们“在堆栈上”)。但是,它们比参考副本需要更长的时间。我不知道您针对内存使用或速度的性能指标是什么;这里需要权衡,您就是知道这是什么的人。

它是 更好的 创建这些对象的类或结构?

也许是上课,也许是结构。作为一个经验法则:如果对象是:
1.小
2.逻辑上是一个不可变的值
3.有很多
这样的话,我考虑将其设为结构。否则我会坚持使用引用类型。

如果您需要更改结构的某些字段,通常最好构建一个构造函数,该构造函数返回正确设置了字段的整个新结构。也许稍微慢一点(测量一下!),但是从逻辑上讲,更容易推理。

垃圾收集器是否平等地处理堆和堆栈上的对象?

,它们不一样,因为 堆栈上的对象是集合的根 。垃圾收集器不需要询问“堆栈中的这个东西还活着吗?”
因为该问题的答案始终是“是的,它在堆栈上”。(现在,您不能依靠它来 使 对象 保持
活动状态,因为堆栈是实现细节。允许抖动引入优化,例如,注册通常是堆栈值的内容,然后再将其保存在堆栈中因此,GC并不知道它还活着。注册的对象可以在不再次读取保存在其上的寄存器时,主动收集其后代。)

但是垃圾收集器 确实
必须将堆栈上的对象视为活动对象,就像将已知的活动对象视为活动对象一样。堆栈上的对象可以引用需要保持活动状态的堆分配对象,因此,为了确定活动集,GC必须将堆栈对象视为活动的堆分配对象。但是显然,出于压缩堆的目的,它们
被视为“活动对象”,因为它们首先不在堆中。

明白了吗?

2020-05-19