如何检查我是否处于已检查的上下文中?
How can I check if I'm in a checked context?
如何使用 C# 代码确定我是否处于 checked
上下文中,没有 causing/catching 和 OverflowException
,并且会导致性能下降?
checked
与 unchecked
块之间的唯一区别是编译器为基本值类型算术运算生成的 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
.
的部分原因
如何使用 C# 代码确定我是否处于 checked
上下文中,没有 causing/catching 和 OverflowException
,并且会导致性能下降?
checked
与 unchecked
块之间的唯一区别是编译器为基本值类型算术运算生成的 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
.