我有与这篇 MSDN 杂志文章相关的问题。
阅读简介 正如我刚刚解释的那样,编译器有时会将多个阅读融合为一个。编译器还可以将单个读取拆分为多个读取。在 .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 值在 obj.ToString 表达式中永远不会为空。但是,这行代码实际上可能会抛出 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);
}
}
我在这里错过了一些重要的事情吗?