当结构比类更好?

Mik*_*ail 14 .net c# structure class

重复:何时在C#中使用struct?

是否有实际的理由在Microsoft .NET 2.0/3.5中使用结构而不是某些类?

"结构和类之间有什么区别?" - 这可能是关于".NET开发人员"职位空缺的最热门问题.面试官认为正确的唯一答案是"结构在堆栈上分配,类在堆上分配",没有进一步的问题.

一些谷歌搜索显示:

a)结构有很多限制,与类相比没有额外的能力,
b)堆栈(和这样的结构)在非常特殊的条件下可以更快,包括:

  • 数据块的大小少于16个字节
  • 没有广泛的装箱/拆箱
  • 结构的成员几乎是不可改变的
  • 整套数据不大(否则我们得到堆栈溢出)

(如果错误或未满,请更正/添加到此列表中)

据我所知,大多数典型的商业项目(ERM,会计,银行解决方案等)甚至没有定义单一结构,所有自定义数据类型都被定义为类.这种方法有什么不对或至少是不完美的吗?

注意:问题是关于普通商业应用程序,请不要列出游戏开发,实时动画,向后兼容性(COM/Interop),非托管代码等"异常"案例 - 这些答案是已经在这个类似的问题下:

何时使用struct?

Fox*_*ire 12

据我所知,大多数典型的商业项目(ERM,会计,银行解决方案等)甚至没有定义单一结构,所有自定义数据类型都被定义为类.这种方法有什么不对或至少是不完美的吗?

没有!一切都完全正确.您的一般规则应该是默认情况下始终使用对象.毕竟我们讨论的是面向对象的编程,而不是面向结构的编程(结构本身缺少一些OO原则,如继承和抽象).

但是结构有时会更好,如果:

  • 您需要精确控制所使用的内存量(结构使用(取决于大小)一点点内存比对象少FAR.
  • 您需要精确控制内存布局.这对于与Win32或其他本机API的互操作尤其重要
  • 你需要尽可能快的速度.(在许多具有较大数据集的情况下,正确使用结构时可以获得相当快的速度).
  • 您需要浪费更少的内存并在阵列中拥有大量结构化数据.特别是与阵列结合使用,您可以通过结构节省大量内存.
  • 你正在广泛地使用指针.然后结构提供了许多有趣的特征.

  • 它们本质上是非 oo 的,因为结构总是按值复制。通常的按引用复制对于结构来说不存在/不可能。因此,如果您想要拥有与一条街道相关的两栋房屋,如果两者都是结构,则不可能设计,因为这些房屋将具有街道结构的 2 个不同(尽管内容相同)副本。 (2认同)

Nik*_*iki 8

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倍.


Bri*_*sen 6

堆栈分配值类型的一个优点是它们是线程的本地.这意味着它们本质上是线程安全的.对于堆上的对象,这不能说.

这当然假设我们正在讨论安全的托管代码.


Kon*_*man 3

与类的另一个区别是,当您将结构实例分配给变量时,您不仅复制引用,而且实际上复制整个结构。因此,如果您修改其中一个实例(无论如何都不应该,因为结构实例应该是不可变的),则另一个实例不会被修改。