3

私は今日、私が予期していなかった言語行動に出くわしました。今、私はその理由を知りたがっています。次の例を考えてみましょう。

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

私の例では、imageはnullであったため、この行はNullReferenceException;をスローしました。ただし、cellそれでもインクリメントされ、もちろん、catchブロックで再びインクリメントされました。最初のポストインクリメント操作が実行されたのはなぜですか?worksheetまた、 nullの場合は実行されたのでしょうか?

ありがとう、ピート

4

1 に答える 1

10

メソッド呼び出しの引数は、左から右に評価されます。

NullRefereneException使用をキャッチする代わりにif(image != null)。例外は遅いです。

起こっていることの順序:

  1. cell値パラメータ用にコピーされます
  2. cell2番目のパラメーターの式の最後の操作としてインクリメントされます。cell++
  3. image.DisplayCaption()
  4. worksheet.AddCell(row, <non-incremented value>, <result of DisplayCaption()>);

手順3からNullReferenceException手順4になりますが、発生しません。

于 2012-10-25T18:56:17.913 に答える