C#类更改事件导致对象引用未设置为对象的实例

时间:2011-06-02 18:23:14

标签: c# events

我需要在更改属性时触发事件。当我运行此代码时,我得到的Object引用未设置为对象的实例。我究竟做错了什么?实例化事件的正确方法是什么,并在设置属性时触发它?

公共成员:

public event System.EventHandler ClassChanged;

属性集:

ClassChanged(this, EventArgs.Empty);

5 个答案:

答案 0 :(得分:6)

您需要首先验证事件处理程序是否为null:

if (ClassChanged != null)
    ClassChanged(this, EventArgs.Empty);

但总的来说,您可能希望将其包装成一个辅助方法,如下所示:

private void NotifyClassChanged() {
    if (ClassChanged != null)
        ClassChanged(this, EventArgs.Empty);
}

或者可能实现INotifyPropertyChanged

答案 1 :(得分:3)

试试这个:

System.EventHandler handler = this.ClassChanged;
if (handler != null)
{
    handler(this, EventArgs.Empty);
}

答案 2 :(得分:2)

这样做是因为没有事件处理程序订阅该事件。

确保事件的多播委托不是线程安全的null的正确方法:

var cc = ClassChanged; //makes a copy
if (cc != null)
    cc(this, EventArgs.Empty);

但是,我更喜欢的方法是使用空的lambda处理程序声明事件,因此它永远不会null

public event EventHandler ClassChanged = (o,e) => {};

答案 3 :(得分:1)

就像joel说的那样,没有附加到这个方法的监听器,这就是你获得异常的原因。另一种处理方法是创建一个方法,检查它是否为null,然后调用此方法而不是Event

所以,如果你有

public event System.EventHandler ClassChanged;    

ClassChanged(this, EventArgs.Empty);

您可以创建以下方法

private void OnClassChanged()
{
   if (ClassChanged != null)
   {
       ClassChanged(this, EventArgs.Empty);
   }
}

并调用OnClassChanged(...)而不是ClassChanged(...)事件

答案 4 :(得分:0)

可能是ClassChanged没有附加事件处理程序。 (看不到剩下的代码) 因此,在启动ClassChanged之前,首先检查它是否为空。

if (ClassChanged != null)
{
  ClassChanged(this, nully);

}