C#从列表中传递对象<;T>;作为参数

C#从列表中传递对象<;T>;作为参数,c#,C#,我有一个存储一些值的列表。我定义了一个事件,它应该弹出并将该列表中的最后一个对象返回给它的EventArgs类构造函数 但是当事件被激发时,我在这一行得到一个System.NullException: OnID(这是新的OnIDEventArgs(ID_List.Last()) 我试图将最后一个IDs对象传递给OnIDEventArgs构造函数。为什么这是一个空例外? public delegate void EventHandler(object sender, OnIDEventArgs e

我有一个存储一些值的列表。我定义了一个事件,它应该弹出并将该列表中的最后一个对象返回给它的EventArgs类构造函数

但是当事件被激发时,我在这一行得到一个
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())