C# 变量导致NullReferenceException,即使它为';s集

C# 变量导致NullReferenceException,即使它为';s集,c#,.net,events,nullreferenceexception,C#,.net,Events,Nullreferenceexception,也许我做了一些非常错误的事情,但不知何故,这段代码总是会因NullReferenceException而崩溃: public class IncomingMessageEventData : EventArgs { public IncomingMessageEventData(SpecialClasses.IncomingMessageData _msg, List<string> _toreturn) { msg = _msg; T

也许我做了一些非常错误的事情,但不知何故,这段代码总是会因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;
}
公共类IncomingMessageEventData:EventArgs
{
public IncomingMessageEventData(specialclass.IncomingMessageData消息,列表返回)
{
味精=_味精;
ToReturn=_ToReturn;
}
public specialclass.IncomingMessageData消息{get;set;}
公共列表返回{get;set;}
}
公共委托无效IncomingMessageHook(IncomingMessageEventData参数);
公共事件输入消息钩子输入消息;
公共字符串NewMessage(字符串[]\u消息,System.Net.IPEndPoint RemoteIP)
{
if(InComingMessage!=null)
{
IncomingMessageEventData=新的IncomingMessageEventData(新的特殊类.IncomingMessageData(_message,RemoteIP),new List());
字符串ToReturn=“”;
输入信息(数据);
foreach(data.ToReturn中的var项)
{
如果(item.Length>0)
返回=项目;
}
回归回归;
}
否则返回null;
}
有两种方法同时连接到事件,这可能是原因吗?如果是,我如何避免它?或者传递ref列表不是从钩子方法获取值的方法吗

谢谢

编辑:更新代码。现在可以用了。。。我想我知道我做错了什么

看,这是程序的一部分,它使用通过反射加载的插件,可能有一点点的可能性,我忘记了在调试之前将更新的插件dll复制到插件目录中。呵呵。^^;
很抱歉但至少我的代码现在使用了最佳实践;P非常感谢你的回答,我会记下它作为答案

这里有很多问题

列表
作为ref参数传递不是一个好方法。只需使用该类型上已有的标准
Add
/
Remove
方法,就可以在不涉及
ref
/
out
的情况下修改
列表

您正在使用事件处理程序的非标准表单。更传统的做法是坚持使用
EventHandler
,其中
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(/* ... */));
}
//在本地
EventHandler=this.MyEvent;
if(处理程序!=null)
{
//使用本地副本调用
handler(这是新的MyEventArgs(/*…*/);
}

这里有多个问题

列表
作为ref参数传递不是一个好方法。只需使用该类型上已有的标准
Add
/
Remove
方法,就可以在不涉及
ref
/
out
的情况下修改
列表

您正在使用事件处理程序的非标准表单。更传统的做法是坚持使用
EventHandler
,其中
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(/* ... */));
}
//在本地
EventHandler=this.MyEvent;
if(处理程序!=null)
{
//使用本地副本调用
handler(这是新的MyEventArgs(/*…*/);
}

能否提供
输入消息方法的代码?是否确定返回值不为空?您确定
NullReferenceException
的位置正确吗?该参数不应为
ref
。请向我们展示委托中的方法。哪一行引发异常?堆栈跟踪是什么?尝试禁用“仅我的代码”以在堆栈窗口中获取更多有用的数据:能否为InComingMessage方法提供代码?是否确定返回值不为空?您确定
NullReferenceException
的位置正确吗?该参数不应为
ref
。请向我们展示委托中的方法。哪一行引发异常?堆栈跟踪是什么?尝试禁用“仅我的代码”以在堆栈窗口中获取更多有用的数据:我将尝试以这种方式实现它。删除'ref'并没有改变它,但是我现在要实现这个类。我会尝试这样实现它。删除'ref'并没有改变它,但是我现在要实现这个类。