C#从列表中传递对象<;T>;作为参数
我有一个存储一些值的列表。我定义了一个事件,它应该弹出并将该列表中的最后一个对象返回给它的EventArgs类构造函数 但是当事件被激发时,我在这一行得到一个C#从列表中传递对象<;T>;作为参数,c#,C#,我有一个存储一些值的列表。我定义了一个事件,它应该弹出并将该列表中的最后一个对象返回给它的EventArgs类构造函数 但是当事件被激发时,我在这一行得到一个System.NullException: OnID(这是新的OnIDEventArgs(ID_List.Last()) 我试图将最后一个IDs对象传递给OnIDEventArgs构造函数。为什么这是一个空例外? public delegate void EventHandler(object sender, OnIDEventArgs e
System.NullException
:
OnID(这是新的OnIDEventArgs(ID_List.Last())代码>
我试图将最后一个IDs对象传递给OnIDEventArgs构造函数。为什么这是一个空例外?
public delegate void EventHandler(object sender, OnIDEventArgs e);
public event EventHandler OnID;
IDs result = ID_List.FirstOrDefault(x => x.TID == tid_value);
if (result != null)
{ //stuff }
else {
ID_List.Add(new IDs
{
TID = tid_value,
CENTID = centid_value,
IDCount = 1
});
OnID(this, new OnIDEventArgs(ID_List.Last())); //System.NullException comes up here
}
IDs类
public class IDs
{
public string TID { get; internal set; }
public string CENTID { get; internal set; }
public int IDCount { get; internal set; }
}
EventArgs类
public class OnIDEventArgs : EventArgs
{
public string LastTID { get; private set; }
public string LastCENTID { get; private set; }
public int IDCount { get; private set; }
public OnIDEventArgs(IDs result)
{
this.LastTID = result.TID;
this.LastCENTID = result.CENTID;
this.IDCount = result.IDCount;
}
}
这可能是因为没有订阅OnID
事件,因此OnID
委托为空,因此对其调用Invoke
将抛出一个NRE
为了避免这种情况,只需先检查OnID
是否为空:
if (OnID != null) {
OnID(this, new OnIDEventArgs(ID_List.Last()))
}
或:
最后一个是安全的。理论上,对于第一个线程,为了避免两次读取事件的底层字段(如果另一个线程同时取消订阅最后一个订阅者,这可能会有问题),您应该执行var onIDDel=OnID;if(onIDDel!=null){onIDDel(this,new-OnIDEventArgs(ID_List.Last());}
。
OnID?.Invoke(this, new OnIDEventArgs(ID_List.Last())