1

小さなアプリケーションを作成しましたが、リストボックスで表示できる何らかのタイプのログを組み込みたいと考えています。データのソースは、任意の数の場所から送信できます。デリゲートを渡す新しいログ クラスを作成しました。私は解決策に近づいていると思いますが、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

4 に答える 4

1

null をチェックするように 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);
       }
   }
}

ただし、例外が発生する理由は、新しい OtherClass を作成しているときに myClass で、デリゲートが「指す」必要があるメソッドを提供していないためです。したがって、OtherClass 呼び出しtextToBox(foo);の場合、その背後にメソッドがなく、爆発します。

于 2010-04-14T17:50:59.037 に答える
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);
   }
}
于 2010-04-14T17:47:12.620 に答える
1

MainForm で作成した OtherClass インスタンスを myClass コンストラクターに渡す必要があります。 myClass に OtherClass インスタンスを作成しないでください。これは、ハンドラーをアタッチしたインスタンスではありません。

于 2010-04-14T17:56:01.477 に答える
1

myClass では、TextToBox を受け取るオーバーロードされた OtherClass コンストラクターを呼び出していないため、textToBox が設定されていないため、textToBox(foo) は失敗します。

myClass が初期化されて呼び出されるコードを表示できますか?

于 2010-04-14T17:58:22.907 に答える