この MSDN マガジンの記事に関連する質問があります。
はじめに 先ほど説明したように、コンパイラは複数の読み取りを 1 つに融合することがあります。コンパイラは、1 つの読み取りを複数の読み取りに分割することもできます。.NET Framework 4.5 では、読み取りの導入は読み取りの削除よりもはるかに一般的ではなく、非常にまれな特定の状況でのみ発生します。ただし、時々発生します。
public class ReadIntro {
private Object _obj = new Object();
void PrintObj() {
Object obj = _obj;
if (obj != null) {
Console.WriteLine(obj.ToString());
// May throw a NullReferenceException
}
}
void Uninitialize() {
_obj = null;
}
}
PrintObj メソッドを調べると、obj.ToString 式で obj 値が null になることはないようです。ただし、そのコード行は実際には NullReferenceException をスローする可能性があります。CLR JIT は、次のように記述されているかのように PrintObj メソッドをコンパイルする場合があります。
void PrintObj() {
if (_obj != null) {
Console.WriteLine(_obj.ToString());
}
}
しかし、それはイベントを扱うパターンではありませんか?!
void RaiseEvent()
{
var myEvent = MyEvent;
if (myEvent != null)
{
myEvent(this, EventArgs.Empty);
}
}
ここで重要なことを見逃していますか?