如何检查我是否处于已检查的上下文中?

7

如何使用C#代码查找当前是否处于“checked”上下文中,而不会导致/捕获“OverflowException”并带来性能损失?


有需要知道的实际原因吗?如果你需要处于其中一个上下文中,那就需要使用checkedunchecked运算符。如果你不需要处于其中任何一个,那么为什么要关心它呢? - Preston Guillot
1
我害怕引发/捕获OverflowException是迄今为止最简单的方法,如果不是唯一的方法。 - kennyzx
@PrestonGuillot(说)我想要实现一个算术操作,只有在checked内才会抛出算术溢出异常。 - Evgeniy Berezovsky
@EugeneBeresovsky我不知道链接答案中所提到的未定义角落案例,很有趣。就它的价值而言,未定义情况仍在C# 5.0规范中。 - Preston Guillot
1个回答

6

一个被选中的块和一个未选中的块之间唯一的区别是编译器为基本值类型算术操作生成的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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接