什么情况下使用结构体比类更好?
什么情况下使用结构体比类更好?
这个问题已经有答案了:
重复的:在C#中什么时候使用结构体?
是否有实际的理由使用结构体而不是某些类在Microsoft .NET 2.0/3.5中?
“结构体和类之间有什么区别?”- 这可能是对“.NET开发人员”空缺的最流行的问题。 面试者认为的唯一正确答案是“结构体在堆栈上分配,而类在堆上分配”,并且没有进一步的问题。
一些Google搜索显示:
a)结构体有许多限制,在与类进行比较时没有额外的能力
b)堆栈(因此结构体)可以在非常专业的条件下更快,包括:
- 数据块大小小于16字节
- 无需频繁装箱/拆箱
- 结构体的成员几乎是不可变的
- 整个数据集不大(否则会发生堆栈溢出)
(如果这个列表是错误的或不完整,请纠正/添加)
据我所知,大多数典型的商业项目(ERM、会计、银行解决方案等)甚至不定义单个结构体,所有自定义数据类型都定义为类。这种方法是否有任何问题或至少存在缺陷?
注意:问题是关于常规业务应用程序的,不要列出像游戏开发,实时动画,向后兼容(COM / Interop),非托管代码等“不寻常”案例 - 这些答案已经在类似问题下回答过了:当使用 struct?
在我看来,最重要的使用案例是包含大量小复合实体的大数组。想象一下包含10^6个复数的数组。或者一个包含1000x1000 24位RGB值的2D数组。在这些情况下,使用结构体而不是类可以产生巨大的差异。
编辑:为了澄清:假设你有一个结构体
struct RGB { public byte R,G,B; }
如果您声明了一个1000x1000的RGB值数组,这个数组将占用正好3 MB的内存,因为值类型是内联存储的。
如果您使用类而不是结构体,则数组将包含1000000个引用。这本身就需要4或8 MB(在64位机器上)的内存。如果您使用单独的对象初始化所有条目,使您可以单独修改值,则会有1000000个对象在托管堆上旋转以让GC忙碌。每个对象都有2个引用的开销(如果我没记错),即对象将使用11/19 MB的内存。总的来说,这是简单结构体版本5倍的内存。
据我所知,大多数典型的商业项目(ERM、会计、银行解决方案等)甚至没有定义一个结构,所有的自定义数据类型都是定义为类。这种方法有什么问题或者至少是不完美的吗?\n\n不!这种方法是完全正确的。你的通用规则应该是默认使用对象。毕竟我们谈论面向对象编程是有原因的,而不是结构导向编程(结构体本身缺少一些面向对象的基本原则,如继承和抽象)。\n\n然而,结构体有时更好,如果:\n\n1. 您需要精确控制所使用的内存量(根据大小,结构体使用的内存量可能比对象少得多)。\n\n2. 您需要精确控制内存布局。这对于与Win32或其他本地API的交互尤其重要。\n\n3. 您需要尽可能快的速度(在许多情况下,正确使用结构体可以获得相当大的速度提升)。\n\n4. 您需要浪费更少的内存,并在数组中拥有大量结构化数据。特别是在与数组结合使用时,结构体可以节省大量的内存。\n\n5. 您需要广泛使用指针。然后,结构提供许多有趣的特性。