Mik*_*ail 14 .net c# structure class
是否有实际的理由在Microsoft .NET 2.0/3.5中使用结构而不是某些类?
"结构和类之间有什么区别?" - 这可能是关于".NET开发人员"职位空缺的最热门问题.面试官认为正确的唯一答案是"结构在堆栈上分配,类在堆上分配",没有进一步的问题.
一些谷歌搜索显示:
a)结构有很多限制,与类相比没有额外的能力,
b)堆栈(和这样的结构)在非常特殊的条件下可以更快,包括:
- 数据块的大小少于16个字节
- 没有广泛的装箱/拆箱
- 结构的成员几乎是不可改变的
- 整套数据不大(否则我们得到堆栈溢出)
(如果错误或未满,请更正/添加到此列表中)
据我所知,大多数典型的商业项目(ERM,会计,银行解决方案等)甚至没有定义单一结构,所有自定义数据类型都被定义为类.这种方法有什么不对或至少是不完美的吗?
注意:问题是关于普通商业应用程序,请不要列出游戏开发,实时动画,向后兼容性(COM/Interop),非托管代码等"异常"案例 - 这些答案是已经在这个类似的问题下:
Fox*_*ire 12
据我所知,大多数典型的商业项目(ERM,会计,银行解决方案等)甚至没有定义单一结构,所有自定义数据类型都被定义为类.这种方法有什么不对或至少是不完美的吗?
没有!一切都完全正确.您的一般规则应该是默认情况下始终使用对象.毕竟我们讨论的是面向对象的编程,而不是面向结构的编程(结构本身缺少一些OO原则,如继承和抽象).
但是结构有时会更好,如果:
IMO最重要的用例是小型复合实体的大型数组.想象一个包含10 ^ 6个复数的数组.或者包含1000x1000 24位RGB值的2d数组.使用struct而不是类可以在这些情况下产生巨大的差异.
编辑:澄清:假设你有一个结构
struct RGB
{
public byte R,G,B;
}
Run Code Online (Sandbox Code Playgroud)
如果声明一个1000x1000 RGB值的数组,则此数组将占用3 MB的内存,因为值类型以内联方式存储.
如果使用类而不是结构,则数组将包含1000000个引用.仅此一项就需要4或8 MB(在64位机器上)内存.如果您使用单独的对象初始化所有项目,因此您可以单独修改这些值,您可以在托管堆上旋转1000000个对象以保持GC忙碌.每个对象都有2个引用的开销(IIRC),即对象将使用11/19 MB的内存.总的来说,它的内存是简单结构版本的5倍.
与类的另一个区别是,当您将结构实例分配给变量时,您不仅复制引用,而且实际上复制整个结构。因此,如果您修改其中一个实例(无论如何都不应该,因为结构实例应该是不可变的),则另一个实例不会被修改。