Класс ведения журнала с использованием делегатов (NullReferenceException) - PullRequest
1 голос
/ 14 апреля 2010

Я создал небольшое приложение, но теперь я хотел бы включить некоторые типы журналов, которые можно просматривать через список. Источник данных может быть отправлен из любого количества мест. Я создал новый класс протоколирования, который будет передаваться делегату. Я думаю, что я близок к решению, но я получаю исключение 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 ]

1 голос
/ 14 апреля 2010

В myClass вы не вызываете перегруженный конструктор OtherClass, который принимает TextToBox, поэтому textToBox (foo) завершается ошибкой, поскольку textToBox не был установлен.

Можете ли вы показать код, где инициализируется и вызывается myClass?

1 голос
/ 14 апреля 2010

Измените свой OtherClass, чтобы проверить на ноль:

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);, позади него нет метода, и он взрывается.

1 голос
/ 14 апреля 2010

Вы должны передать в конструктор myClass свой экземпляр OtherClass, созданный в MainForm, не создавайте экземпляр OtherClass в myClass, это не тот экземпляр, к которому вы прикрепили обработчик.

1 голос
/ 14 апреля 2010

Удалите пустой конструктор и передайте соответствующий делегат.

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);
   }
}
...