我正在学习课程3354(在.NET Framework 2.0中实现系统类型和接口),据说对于具有成员变量和函数的简单类而言,使用struct比使用class更好,因为能够减少开销。
我从未听说过这样的说法,这种说法是否有可靠性呢?
我建议除非你有非常特定的用例并且知道结构体将如何使系统受益,否则不要使用结构体。
虽然C#结构体允许成员,但它们与类的工作方式有很大不同(不能被子类型化,没有虚拟分派,可能完全存在于堆栈上),并且行为会随着提升等因素而改变。(提升是将值类型提升到堆上的过程--惊喜!)
所以,回答这个问题:我认为C#中最大的误解之一就是使用结构体“提高性能”。原因是“开销”无法真正衡量,除非看到它如何与系统的其余部分交互以及它所扮演的角色(如果有任何值得注意的)。这需要进行分析,并且不能用“开销更小”的如此琐碎的陈述来概括。
对于结构体值类型,有一些好的情况--一个例子是存储在图像数组中的复合RGB值。这是因为RGB类型很小,在图像中可以有很多,值类型可以在数组中很好地打包,并且可能有助于保持更好的内存局部性等。
你在编程中将会大部分时间使用类。往往在后期,值类型的语义会给你带来更多麻烦。
然而,如果你选择使用结构体,请确保它是不可变的。
你可以遵循的一个经验法则是问自己你正在尝试做的事情是否像System.Date
如果不是,那么你应该非常质疑使用结构体的决定。
对于简单类型,如果你需要很多个实例,不需要继承,并且是不可变的好选择,那么结构体是一个不错的选择。例如:Point、Rectangle、Decimal和DateTime。
如果你不需要很多实例,那么开销就不重要了,这不应该影响你的决定。如果你将来需要从它派生(或使它成为派生类型),那么它必须是一个类。如果该项不能是不可变的,则结构体不是一个好的选择,因为更改一个实例不会更改任何副本。
我相信最常引用的收支平衡点是在结构体中约为12个字节的数据。例如,3个整数。然而,值类型和引用类型之间的区别更加基本,对于成员较少的类型,您应该根据此进行选择。
如果某些东西很大,那就使用类吧 :)
结构体是值类型,而类是引用类型。因此,如果你要传递引用,从性能上来说,类可以更好,因为你只需要复制一个地址而不是整个结构。然而,如果你要实例化和引用这些对象很多次,结构体将更具优势,因为它们分配在堆栈上。因此,在需要高性能的大量对象或需要值类型语义的小对象中,结构体可能更好。结构体也没有默认构造函数。它们继承自Object,但除此之外它们没有继承。