如何检查我是否处于检查状态?

如果我处于已checked上下文中,如何在不导致/捕获OverflowException情况下,如何使用C#代码找出性能损失?

checked块与unchecked checked块之间的唯一区别是编译器为基本值类型算术运算生成的IL指令。 换句话说,以下之间没有可观察到的差异:

 checked { myType.CallSomeMethod(); } 

 myType.CallSomeMethod(); 

但是我们假设有一个算术运算,比如添加两个整数。 您需要获取该方法的IL指令,并检查是否检查了方法调用周围的指令,甚至远非防弹。 您无法判断您的自定义操作是否实际位于已检查的块内,或者只是被选中的块包围,而不是在其中。

即使捕获exception也行不通,因为您无法区分这两种情况:

 checked { int a = (Some expression that overflows); myType.CallSomeMethod(); } 

 checked { int a = (Some expression that overflows); } myType.CallSomeMethod(); 

这可能是Decimal类型不尝试检测已checked vs unchecked的原因的一部分,而是始终抛出OverflowException