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

本文关键字:设置 对象 实例 对象引用 事件 | 更新日期: 2023-09-27 17:58:21

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

公众成员:

public event System.EventHandler ClassChanged;

属性集:

ClassChanged(this, EventArgs.Empty);

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

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

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

但总的来说,你可能想把它包装成一个辅助方法,比如:

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

或者可能改为实现INotifyPropertyChanged。

试试这个:

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

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

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

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

然而,我更喜欢的方法是用一个空的lambda处理程序来声明事件,这样它就永远不会是null:

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

就像joel说的,这个方法没有附加listeters,这就是为什么你会得到一个异常。另一种处理方法是创建一个方法,检查其是否为null,然后调用该方法而不是Event

所以如果你有

public event System.EventHandler ClassChanged;    
ClassChanged(this, EventArgs.Empty);

您创建以下方法

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

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

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

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