使用委托记录类(NullReferenceException)

时间:2010-04-14 17:42:36

标签: c# delegates nullreferenceexception

我创建了一个小应用程序,但我现在想要合并某些类型的日志,可以通过列表框查看。数据来源可以从任意数量的地方发送。我创建了一个新的日志记录类,它将传递一个委托。我认为我接近解决方案,但我收到NullReferenceException,我不知道正确的解决方案。以下是我尝试做的一个例子:

Class1 where the inbound streaming data is received.
class myClass
{
   OtherClass otherClass = new OtherClass();
   otherClass.SendSomeText(myString);
}

记录类

class OtherClass
{
   public delegate void TextToBox(string s);

   TextToBox textToBox;

    Public OtherClass()
    {
    }

   public OtherClass(TextToBox ttb) 
   {
       textToBox = ttb;
   }

   public void SendSomeText(string foo)
   {
       textToBox(foo);
   }
}

表格

public partial class MainForm : Form
   {
   OtherClass otherClass;

   public MainForm()
   {
       InitializeComponent();
       otherClass = new OtherClass(this.TextToBox);
   }

   public void TextToBox(string pString)
   {
       listBox1.Items.Add(pString);
   }

}

每当我在myClass中收到数据时,都会抛出错误。您可以给予任何帮助。

4 个答案:

答案 0 :(得分:1)

删除空构造函数并传递适当的委托。

class OtherClass
{
   public delegate void TextToBox(string s);

   private readonly TextToBox textToBox;

   public OtherClass(TextToBox textToBox) 
   {
       if (textToBox == null)
           throw new ArgumentNullException("textToBox");

       this.textToBox = textToBox;
   }

   public void SendSomeText(string foo)
   {
       textToBox(foo);
   }
}

答案 1 :(得分:1)

更改您的OtherClass以检查null:

class OtherClass
{
   public delegate void TextToBox(string s);

   TextToBox textToBox;

    Public OtherClass()
    {
    }

   public OtherClass(TextToBox ttb) 
   {
       textToBox = ttb;
   }

   public void SendSomeText(string foo)
   {
       var handler = this.TextToBox;
       if(handler != null)
       {
           textToBox(foo);
       }
   }
}

现在您获得异常的原因是因为在您的myClass中创建新的OtherClass时,您没有提供委托应该“指向”的方法。因此,当你是OtherClass调用textToBox(foo);时,它背后没有任何方法,它会爆炸。

答案 2 :(得分:1)

你应该传入myClass构造函数你在MainForm中创建的OtherClass实例,不要在myClass中创建OtherClass实例,它不是你附加处理程序的实例。

答案 3 :(得分:1)

在myClass中,您没有调用带有TextToBox的重载的OtherClass构造函数,因此textToBox(foo)失败,因为尚未设置textToBox。

你能展示myClass初始化和调用的代码吗?