C#类与结构

Microsoft使用struct有以下规​​则:

考虑定义一个结构而不是类,如果类型的实例很小并且通常是短暂的或者通常嵌入其他对象中的话。

除非类型具有以下所有特征,否则不要定义结构:

  • 它在逻辑上代表一个单值,类似于原始类型(整数,双精度等)。
  • 它的实例大小小于16个字节。
  • 它是不可变的。
  • 它不会经常被装箱。
  • 据我所知,当你想要一个值类型的行为时,你可以创建struct。 当然,这可以让您在分配和传递给函数时复制开销。 但你为什么要追随#2和#3? 如果你的价值类型太大了会怎么样? 此外,我不明白你为什么会将不可变类型作为值类型。 如果类型是不可变的,那么最好通过引用来节省时间,因为无论如何它都不能被改变。

    我问的原因是我在做一个游戏,其中的对象具有Vector2d类型的坐标,速度等属性。 问题是,我应该使Vector2d不可变结构体(不需要大量额外的内存吗?),可变结构体(人们说它们是邪恶的)或者只是类(我将不得不始终调用vector.Clone(),否则我可能会无意中得到两个具有相同向量变量的对象)


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

    int类型是一个不可变类型,是您为什么需要不可变值类型的完美例子。

    想象一下,如果int是一个引用类型。 如果您每次使用整数都必须解除引用,那将非常昂贵。 事实上,当你使用“盒装”整数(例如存储在object类型的变量中的整数)时会发生什么。 在.NET中与Java相比的一个改进是集合可以容纳非盒装整数。

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

    是的,如果它很大并且不可变,那么通过参考传递来节省时间。 这就是为什么指导方针建议大类型应该是参考类型。


    16个字节似乎有些随意,但可能与典型CPU的高速缓存行大小有关。 这比现代CPU上的64字节缓存线要小很多。 可能是因为你不能明确地将你的结构对齐到一行。

    保持你再次输入immutable不需要通过引用传递。 而只是返回一个新的实例。 以下引用比使用缓存值的成本要高得多,保持较小的值会增加缓存中的机会。

    一般来说,如果你想引用语义使它成为一个类,否则使它成为一个结构。 我建议你遵循MS准则,除非你能证明使用一个分析器(或其他一些经验证据),否则有很好的理由。


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

    链接地址: http://www.djcxy.com/p/28061.html

    上一篇: C# class vs struct

    下一篇: Why do my array of structs take up so much memory?