c# – 在已检查块中调用的方法中没有溢出异常

checked块用于确保是否发生溢出,抛出异常.例如,

下面的代码抛出溢出异常,这很好.

checked
{
  int a = 123456;
  int b = 123456;
  Console.WriteLine(a * b);
}

但是如果我在checked块中调用一个方法,并且该方法依次具有抛出溢出异常的代码,则check块似乎没有检测到.是否有可能检测到这些.

checked
{
  int a = 123456;
  int b = 123456;
  Console.WriteLine(Mul(a, b));
}

public int Mul(int a, int b)
{
  return a * b;
}

最佳答案 此博客文章提供了有关此主题的一些解释:

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;
   }
}
点赞