为什么不调用null事件处理程序引发异常?

jtp*_*yda 4 c# event-handling thread-safety

阅读此问题后,似乎以下代码应该失败:

private void Form1_Load(object sender, EventArgs e)
{
   EventHandler myHandler = null;
   myHandler(this, null);
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,它运行得很好(并且什么都不做).该代码的行为与以下内容有何不同?

private void Form1_Load(object sender, EventArgs e)
{
   EventHandler myHandler = null;
   EventHandler myCopy = myHandler;
   if (myCopy != null)
   {
      myHandler(this, null);
   }
}
Run Code Online (Sandbox Code Playgroud)

编辑:根据Lasse V. Karlsen的回答,以这种方式捕捉异常是有效的:

private void Form1_Load(object sender, EventArgs e)
{
   try
   {
      EventHandler myHandler = null;
      myHandler(this, null);
   }
   catch (Exception ex)
   {
      this.Text = "Exception!";
   }
}
Run Code Online (Sandbox Code Playgroud)

ang*_*son 6

这里的问题是Load事件吞噬了你的异常.

此处还有其他关于此问题和网上其他帖子的问题:

简而言之,在某些情况下(最常提到的原因是在64位Windows上运行的32位.NET程序),任何WinForms表单的Load事件中的异常都将被吞噬.

您可以将Form Load事件包装在try/catch块中以捕获它,并确定如何对其作出反应.

简而言之2:代码确实会引起您所期望的空引用异常,您只是没有看到它