如何检查我是否处于检查状态?
如果我处于已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
。