3

我今天遇到了一种出乎我意料的语言行为。现在我很想知道为什么。考虑以下示例:

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

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

谢谢,皮特

4

1 回答 1

10

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

而不是抓住NullRefereneExceptionuse 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. 不会发生。

于 2012-10-25T18:56:17.913 回答