如果行抛出异常,为什么执行post增量操作?

sly*_*ete 3 c#

我今天遇到了一种我没想到的语言行为.现在我渴望了解原因.请考虑以下示例:

try
{
    worksheet.AddCell(row, cell++, image.DisplayCaption());
}
catch (NullReferenceException)
{
    cell++;
    throw;
}
Run Code Online (Sandbox Code Playgroud)

在我的例子中,image为null导致此行抛出NullReferenceException; 然而,cell仍然增加,当然,它在catch块中再次增加.为什么执行第一个后期增量操作?另外,如果worksheet是null ,它会被执行吗?

谢谢,皮特

Jak*_*cki 10

方法调用的参数从左到右进行评估.

而不是捕捉NullRefereneException使用if(image != null).例外情况很慢.

发生的事情顺序:

  1. cell 将复制为value参数
  2. cell 作为第二个参数表达式的最后一个操作递增: cell++
  3. image.DisplayCaption()
  4. worksheet.AddCell(row, <non-incremented value>, <result of DisplayCaption()>);

从步骤3开始,NullReferenceException步骤4中的结果不会发生.

  • 不要出于速度原因这样做 - 为了清楚起见,请这样做.您不应该使用异常来处理您可以非常轻松地自己测试的情况. (4认同)