如何使用C#代码查找当前是否处于“checked”上下文中,而不会导致/捕获“OverflowException”并带来性能损失?
一个被选中的块和一个未选中的块之间唯一的区别是编译器为基本值类型算术操作生成的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
类型不试图检测checked
和unchecked
的原因,而总是抛出OverflowException
。
checked
和unchecked
运算符。如果你不需要处于其中任何一个,那么为什么要关心它呢? - Preston GuillotOverflowException
是迄今为止最简单的方法,如果不是唯一的方法。 - kennyzxchecked
内才会抛出算术溢出异常。 - Evgeniy Berezovsky