当我在“Nullable类型”一章中偶然发现一段时,我正在阅读Jon Skeet的“C#in depth”第二版:
令人惊讶的性能陷阱我一直认为做一次检查会比两次快,但似乎并非如此 - 至少我测试过的.NET版本。在编写一个快速基准测试时,它总结了'object []'类型数组中的所有整数,其中只有三分之一的值实际上是盒装整数,使用'is'然后一个演员最终快20倍< / em>而不是使用'as'运算符。
乍一看,我认为可能编译器足够聪明,可以优化使用'is'+强制转换时出现的双重类型检查,但似乎并非如此。使用带有/ OPTIMIZE标志的32位编译器编译的.NET 4.0代码仍导致两个MSIL“isinst”调用。
对于直觉应该相反的情况,这种戏剧性表现差异的解释可能是什么?