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

时间:2012-10-25 18:51:36

标签: c#

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

try
{
    worksheet.AddCell(row, cell++, image.DisplayCaption());
}
catch (NullReferenceException)
{
    cell++;
    throw;
}

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

谢谢,皮特

1 个答案:

答案 0 :(得分:10)

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

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

发生的事情顺序:

  1. cell被复制为值参数
  2. cell作为第二个参数表达式的最后一个操作递增:cell++
  3. image.DisplayCaption()
  4. worksheet.AddCell(row, <non-incremented value>, <result of DisplayCaption()>);
  5. 从步骤3开始,导致NullReferenceException步骤4.不会发生。