C#类更改事件导致对象引用未设置为对象的实例
本文关键字:设置 对象 实例 对象引用 事件 | 更新日期: 2023-09-27 17:58:21
更改属性时需要触发一个事件。当我运行此代码时,我得到一个Object引用,该引用未设置为对象的实例。我做错了什么?实例化事件并在设置属性时激发事件的正确方法是什么?
公众成员:
public event System.EventHandler ClassChanged;
属性集:
ClassChanged(this, EventArgs.Empty);
您需要首先验证事件处理程序是否为空:
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);
}