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

How can I check if I'm in a checked context?

如何使用 C# 代码确定我是否处于 checked 上下文中,没有 causing/catching 和 OverflowException,并且会导致性能下降?

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.

的部分原因