有人可以向我解释检查的未检查块到底是什么吗?
我应该什么时候使用每个?
3 回答
算术溢出;例如:
int i = int.MaxValue -10;
checked {
i+= 20; // boom: OverflowException
// "Arithmetic operation resulted in an overflow."
}
因此checked
,当您不希望意外溢出/环绕成为问题并且宁愿看到异常时使用。
unchecked
显式设置模式以允许溢出;除非您以其他方式告诉编译器,否则默认值是unchecked
- 通过代码(上面)或编译器开关(/checked
在 csc 中)。
来自MSDN
C# 语句可以在选中或未选中的上下文中执行。在检查的上下文中,算术溢出会引发异常。在未经检查的上下文中,算术溢出被忽略并且结果被截断。
简而言之,它们用于定义算术运算发生的上下文。在检查的上下文中,发生溢出时会引发异常。在未经检查的上下文中,不会引发异常,而是将值环绕。
现在,您的上下文是未检查还是检查取决于您的编译器选项。因此,如果您想手动覆盖上下文,即在未检查的上下文中执行检查操作,反之亦然,您应该使用这些关键字。
有关更多详细信息和示例,请点击上面给出的链接。
检查块用于处理算术上溢/下溢情况。例如:
假设您要将 int 值转换为 short 类型值(称为窄化转换)。int 类型变量的取值范围为 -2,147,483,648 到 2,147,483,647。但空头只能从 -32,768 到 32,767。
由于这个原因,短变量不能具有 int 变量可以具有的所有可能值。如果某种方式,可以转换为以下示例:
int y = 1000000000;
short x = (short)y;
显然,您可以看到 y 的值在短变量的有效值之外。于是就发生了算术溢出的情况。
默认情况下,C# 不会对上述代码抛出任何异常。但是有几种方法可以引发异常并处理它。在这种情况下,检查块会派上用场
try
{
checked
{
int y = 1000000000;
short x = (short)y;
}
}
catch (OverflowException ex)
{
MessageBox.Show("hey, we got a overflow/underflow situation");
}
catch (Exception ex)
{
MessageBox.Show("Error");
}
如果强制转换导致溢出/下溢情况,catch 块会引发溢出异常。在这种情况下,它会显示错误消息
“嘿,我们遇到了上溢/下溢的情况”
如果我们想在转换发生时丢弃下溢/溢出并继续操作,则使用未检查块。