拳击和拆箱是否具有相同的性能?

pen*_*ake 8 .net heap clr boxing unboxing

拳击和拆箱是否具有相同的性能?或者说取消装箱更快,让我们说吧?

(如果是,可以简要解释一下主要原因.)

谢谢

Jon*_*eet 12

它部分取决于你的意思是"拆箱".在IL术语中,拆箱实际上比在C#中略微减少.在C#中,"取消装箱"总是涉及在某处复制值,而在IL中它只表示检查盒子的类型并以这种方式使值可用.

它们具有不同的性能特征:装箱需要分配新对象,但不需要进行类型检查.

IL级别的拆箱实际上只需要检查您尝试拆箱的对象是否是相同类型(或兼容的)的盒装值.然后,您需要在C#版本的拆箱中添加值复制操作.

从长远来看,我认为分配比类型检查更昂贵,特别是因为不仅预先分配成本,而且后来相应的垃圾收集.

与往常一样,您应该在实际代码的上下文中评估操作的性能成本.我不认为装箱和拆箱的成本在大多数现代.NET应用程序中都很重要,在这些应用程序中,泛型允许您将它们用于集合等.