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

时间:2015-01-22 01:41:05

标签: c# .net math

如果我在checked上下文中,如果我没有导致/捕获OverflowException而导致性能下降,我怎样才能找到使用C#代码?

1 个答案:

答案 0 :(得分:4)

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

checked {
  myType.CallSomeMethod();
}

myType.CallSomeMethod();

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

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

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

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

这可能是Decimal类型未尝试检测checkedunchecked并且始终抛出OverflowException的原因的一部分。