checked block用于确保是否发生溢出,抛出异常。例如,
以下代码抛出溢出异常,这很好。
checked
{
int a = 123456;
int b = 123456;
Console.WriteLine(a * b);
}
但是如果我在被检查的块中调用一个方法,并且该方法依次具有抛出溢出异常的代码,则被检查的块似乎没有检测到它。是否也可以检测到这些。
checked
{
int a = 123456;
int b = 123456;
Console.WriteLine(Mul(a, b));
}
public int Mul(int a, int b)
{
return a * b;
}
答案 0 :(得分:2)
此博客文章对此主题提供了一些解释:
https://blogs.msdn.microsoft.com/oldnewthing/20140815-00/?p=233
简而言之:在编译时检测是否以已检查或未检查模式执行语句,而不是在运行时检测到。如果您的程序流离开包含函数方法调用的已检查块,则检查/未检查状态特定于函数本身。
可以从已检查和未检查的代码中调用Mul
方法 - 如下所示:
checked
{
int a = 123456;
int b = 123456;
Console.WriteLine(Mul(a, b));
}
unchecked
{
int a = 123456;
int b = 123456;
Console.WriteLine(Mul(a, b));
}
如何实现异常行为?抛出异常与否?
所以你必须在Mul
方法中具体,并在那里创建一个选中的块。
public int Mul(int a, int b)
{
checked {
return a * b;
}
}