2

2 つのクラスがあり、これらのクラス間で通信するためのイベントを作成する必要があります。

Class a
{
    public delegate void delegat(int a);
    public event delegat exit;
    ...
    private void a_FormClosed(object sender, FormClosedEventArgs e)
    {
         // My event named exit should run here, but I get exception!
        exit(100);
    }
}

Class b
{
    a instance=new a();
    a.exit+=new a.delegat(my_fun);
    ...
    private void my_fun(int x)
    {
        if(x==100)
        do_smth;
        ...
    }
}

しかし、問題は、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という例外が発生することです。私は何が間違っているのか理解できませんか?これの新しいインスタンスをどこで作成する必要がありますか? 手伝ってくれてありがとう!

4

4 に答える 4

2

インスタンスではなく、クラス自体にexitイベントを割り当てようとしています。

a.exit += ...

次のようにする必要があります。

instance.exit += ...

exitまた、イベントを発生させる前に、イベントが割り当てられているかどうかを確認していません。競合状態など、考慮していない他の問題があります。

これは、イベントを処理する比較的安全な方法の一般的な例です。

public class A
{
    public delegate void ExitHandler(object sender, int a);
    public event ExitHandler Exit;
    ...
    private void a_FormClosed(object sender, FormClosedEventArgs e)
    {
        OnExit(100);
    }

    protected virtual void OnExit(int a)
    {
        // take a reference to the event (incase it changes)
        var handler = Exit;
        if (handler != null)
        {
            handler(this, a);
        }
    }

}

public class B
{
    private A _a;

    public B()
    {
        _a = new A();
        _a.Exit += (sender, value) => my_fun(value);
    }

    private void my_fun(int x)
    {
        if(x==100)
            do_smth;
        ...
    }
}
于 2012-12-14T14:01:50.827 に答える
0

イベントを呼び出すための「クラスa」コードを次のように変更します。

Class a
{
  public delegate void delegat(int a);
  public event delegat exit;
  ...
  private void a_FormClosed(object sender, FormClosedEventArgs e)
    {
     if (this.exit != null)  // just in case a_FormClosed fires before assigning the event
         exit(100);//here should run my event named exit but i get exception!
     }
}
于 2012-12-14T14:02:38.273 に答える
0

これを試して

namespace foo
    {
    public delegate void delegat(int a);
    Class a
    {
      public event delegat exit;
      private void a_FormClosed(object sender, FormClosedEventArgs e)
        {
if(exit != null)
{
         exit(100);//here should run my event named exit but i get exception!
    }
         }
     }
    }

     Class b
     {
      a instance=new a();
      instance.exit+=new delegat(my_fun);
      ...
      priavte void my_fun(int x)
      {
       if(x==100)
        do_smth;
       ...
       }
     }
于 2012-12-14T14:07:19.600 に答える
0

イベントを発生させる前に、イベントにサブスクライバーが存在するかどうかを確認します。

if (exit != null)
    exit(100);

別のオプション - クラス A でイベントを定義するときに、ダミーのイベント ハンドラーをサブスクライブします。

public event delegat exit = (_) => { };

また、型、イベント、およびメソッドには PascalCase の命名を使用します。また、.NET には定義済みのデリゲートがあり、引数を 1 つ受け取り、void を返します。Action<T>

于 2012-12-14T13:59:11.737 に答える