首页 文章

C#class vs struct [关闭]

提问于
浏览
2

Microsoft具有以下使用struct的规则:

如果类型的实例很小并且通常是短暂的或者通常嵌入在其他对象中,则考虑定义结构而不是类 . 除非类型具有以下所有特征,否则不要定义结构:它在逻辑上表示单个值,类似于基本类型(整数,双精度等) . 它的实例大小小于16个字节 . 这是不可改变的 . 它不必经常装箱 .

据我所知,当您需要值类型行为时,可以创建struct . 当然,这会在分配并将其传递给函数时为您提供复制开销 . 但是你为什么要关注#2和#3?如果您的 Value 类型太大会怎么样?此外,我不明白为什么你会将不可变类型作为值类型 . 如果类型是不可变的,那么最好通过引用节省传递它的时间,因为无论如何它都无法更改 .

我问的原因是我正在制作一个游戏,其中对象具有Vector2d类型的Coordinates,Velocity等属性 . 问题是,我应该制作Vector2d不可变结构(不需要大量的额外内存吗?),可变结构(人们说它们是邪恶的)或只是类(我必须总是调用vector.Clone(),否则我可能无意中得到两个具有相同矢量变量的对象)

4 回答

  • -1

    此外,我不明白为什么你会将不可变类型作为值类型 .

    int 类型是一个不可变类型,是您需要不可变值类型的完美示例 .

    想象一下,如果 int 是参考类型 . 如果每次使用整数时都必须取消引用,那将是非常昂贵的 . 这实际上是在使用"boxed"整数时发生的情况(例如存储在 object 类型的变量中的整数) . 与Java相比,.NET的一个改进是集合可以保存未装箱的整数 .

    如果类型是不可变的,那么最好通过引用节省传递它的时间

    是的,如果它很大且不可变,那么你可以通过引用传递它来节省时间 . 这就是为什么指南建议大类型应该是参考类型 .

  • 1

    16字节似乎有些随意,但可能与典型CPU的缓存行大小有关 . 这比现代CPU上的64字节高速缓存线要小得多 . 可能是因为您无法将结构明确地与行对齐 .

    保持你再次输入不可变性避免了通过引用传递的需要 . 而只是返回一个新实例 . 以下引用比使用缓存值要昂贵得多,保持对象较小将增加它保留在缓存中的机会 .

    一般来说,如果你想要引用语义使它成为一个类,否则使它成为一个结构 . 我建议您遵循MS指南,除非您可以使用剖析器(或其他一些经验证据)证明有充分的理由不这样做 .

  • 2

    对于#2,大型结构不应该被轻易复制,因此大多数时候应该是一个类 . 而且,这些并不是硬性规则,只是经验法则 . 如果您有充分的理由不遵守规则,请继续 .

  • 0
    • 当传递/操作结构时,必须将整个值复制到堆栈周围而不仅仅是引用 . 一旦达到一定的大小,16个字节,考虑只使用一个类来避免开销 .

    • 不变性更像是一种旨在减少代码错误的模式,而不是一种硬性规则 . 如果您的值类型可能是不可变的,那么实现它可能会有所帮助 .

    你可能会误解不变性 . 您的变量可以更改值,但值本身实际上会在实例初始化后更改实例的字段 .

相关问题