我今天遇到了一种我没想到的语言行为。现在我渴望了解原因。请考虑以下示例:
try
{
worksheet.AddCell(row, cell++, image.DisplayCaption());
}
catch (NullReferenceException)
{
cell++;
throw;
}
在我的示例中,image
为空,导致此行抛出NullReferenceException
;但是,cell
仍然增加,当然,它在catch块中再次增加。为什么执行第一个后期增量操作?另外,如果worksheet
为空,它会被执行吗?
谢谢,皮特
答案 0 :(得分:10)
方法调用的参数从左到右进行评估。
而不是捕捉NullRefereneException
使用if(image != null)
。例外情况很慢。
发生的事情顺序:
cell
被复制为值参数cell
作为第二个参数表达式的最后一个操作递增:cell++
image.DisplayCaption()
worksheet.AddCell(row, <non-incremented value>, <result of DisplayCaption()>);
从步骤3开始,导致NullReferenceException
步骤4.不会发生。