我正在做课程3354(在.NET Framework 2.0中实现系统类型和接口),据说对于简单的类,使用成员变量和函数,由于开销,最好使用结构而不是类.
我从来没有听说过这种说法,这种说法的有效性是什么?
小智 12
我建议永远不要使用结构,除非你有一个非常具体的用例,并确切知道结构将如何使系统受益.
虽然C#结构也允许成员,他们的工作不错位不同,那么类(不能亚型,没有虚拟调度,可以完全生活在栈上),并根据吊装等行为改变(提升是促进的过程堆的值类型 - 惊喜!)
所以,回答这个问题:我认为C#中最大的误解之一就是使用结构"用于表现".造成这种情况的原因是"开销"无法真正衡量,如果没有看到它与系统其他部分的交互方式以及角色(如果有的话,它会起作用).这需要进行分析,不能用"减少开销"等简单的陈述来概括.
结构值类型有一些很好的例子 - 一个例子是存储在图像数组中的复合RGB值.这是因为RGB型小,可以有很图像中的许多人来说,值类型可以在阵列包装好,并可能有助于保持更好的内存局部性,等等.
出于性能原因,通常不应将应该是类的类型更改为结构.结构和类具有不同的语义,并且不完全可互换.确实,结构有时可以更快,但它们有时也可能更慢.它们的行为不同,您应该知道何时使用其中一种.
MSDN有一个关于类和结构之间选择的页面.
摘要是:
除非类型具有以下所有特征,否则不要定义结构:
- 它逻辑上表示单个值,类似于基本类型(整数,双精度等).
- 它的实例大小小于16个字节.
- 这是不可改变的.
- 它不必经常装箱.
偶尔可能存在类型确实应该是类的情况,但出于性能原因,您需要将其作为结构.这很少见,你应该确保在走这条路线之前知道自己在做什么.如果你打破结构的不变性指南,那么这可能会特别危险.可变结构可以以大多数程序员不期望的方式运行.
当C#处于测试阶段时,我接受了对类和结构之间差异的演示.开发人员已经构建了一个Mandelbrot集合查看器,它可以研究很多复杂的数字来完成它的结果.在第一个例子中,他们运行代码,复杂的数字表示为具有Real和Imaginary字段的类.然后,他们将单词class
改为struct
并重新编译.性能差异很大.
在这种情况下,不必分配堆对象也不必垃圾收集它们,这就是产生差异的原因.根据您拥有的物体数量,差异可能或多或少都很大.在开始调整之前,请测量您的性能,然后再决定是否使用值类型.
归档时间: |
|
查看次数: |
3069 次 |
最近记录: |