2017-05-27 7 views
0

私はいくつかの値を格納するリストを持っています。私はポップアップし、最後のObjectをそのリストからEventArgs-Class-Constructorに返すイベントを定義しました。リストからC#を渡すオブジェクト<T>をパラメータとして

しかし、イベントが発生しますと、私はこのラインでSystem.NullExceptionを得る:OnIDEventArgs-コンストラクタに最後のID-オブジェクトを渡そうとし

OnID(this, new OnIDEventArgs(ID_List.Last()));

イム。なぜこれはNullExceptionですか?

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 
    } 

IDのクラス

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; 

     } 
    } 

答えて

1

これは、OnIDイベントにサブスクライブしている何にも考えられますので、OnIDデリゲートがnullであるため、上Invokeを呼び出しますそれはNREを投げるでしょう。

if (OnID != null) { 
    OnID(this, new OnIDEventArgs(ID_List.Last())) 
} 

または::OnIDがnull最初のものであるかどうかを確認するだけで、これを回避する

OnID?.Invoke(this, new OnIDEventArgs(ID_List.Last()) 
+0

これはまさにそれだった、ありがとう! –

+0

最後のものは安全です。最初のものでは、理論上は、イベントの基礎となるフィールドを2回読むのを避けるために、別のスレッドがその間に最後のサブスクライバの登録を解除した場合に問題になる可能性があります。var onIDDel = OnID; if(onIDDel!= null){ onIDDel(これは新しいOnIDEventArgs(ID_List.Last())); } '。 –

関連する問題