簡體   English   中英

即使設置了變量,也會導致NullReferenceException

[英]Variable causes NullReferenceException even though it's set

也許我做錯了什么,但是由於某種原因,此代碼總是由於NullReferenceException崩潰:

public class IncomingMessageEventData : EventArgs
{
    public IncomingMessageEventData(SpecialClasses.IncomingMessageData _msg, List<string> _toreturn)
    {
        msg = _msg;
        ToReturn = _toreturn;
    }
    public SpecialClasses.IncomingMessageData msg { get; set; }
    public List<string> ToReturn { get; set; }
}
public delegate void IncomingMessageHook(IncomingMessageEventData Args);
public event IncomingMessageHook InComingMessage;
public string NewMessage(string[] _message, System.Net.IPEndPoint RemoteIP)
{
    if (InComingMessage != null)
    {
        IncomingMessageEventData data = new IncomingMessageEventData(new SpecialClasses.IncomingMessageData(_message, RemoteIP), new List<string>());
        string ToReturn = "";
        InComingMessage(data);
        foreach (var item in data.ToReturn)
        {
if (item.Length > 0)
    ToReturn = item;
        }
        return ToReturn;
    }
    else return null;
}

有兩種同時掛接到事件的方法,這可能是原因嗎? 如果是這樣,我該如何避免呢? 還是傳遞引用列表不是從掛鈎方法獲取值的方法嗎?

謝謝!

編輯:更新了代碼。 現在哪個有效! ...我想我知道我做錯了什么。

看,該程序是使用通過反射加載的插件的一部分,並且在調試之前,我可能幾乎沒有忘記將更新的插件dll復制到插件目錄的可能性。 .. 呵呵。 ^^; 抱歉! 但是,至少現在我的代碼使用了最佳實踐; P非常感謝您提供的最佳實踐,我將其標記為答案!

這里有多個問題。

List<T>作為ref參數傳遞不是一個好方法。 僅通過使用該類型上已經可用的標准Add / Remove方法,就可以修改List<T>而不涉及ref / out

您正在使用非標准形式的事件處理程序。 更傳統的TEventArgs是堅持使用EventHandler<TEventArgs> ,其中TEventArgs是從EventArgs派生的某個類。 從事件處理程序來回傳遞的數據應該通過使用自定義EventArgs類上的屬性或方法來處理。

您的事件處理程序邏輯不是線程安全的。 您需要捕獲事件處理程序的本地副本,以解決有人在執行空值檢查后立即取消訂閱的情況。 這是典型的模式:

// Capture the handler in a local
EventHandler<MyEventArgs> handler = this.MyEvent;
if (handler != null)
{
    // Invoke using the local copy
    handler(this, new MyEventArgs(/* ... */));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM