チャックブログ

UnityやC#などをメインに公開していきます。C++も勉強始めました!

【C#】delegate(デリゲート)とevent(イベント)

初めに

delegate?event?なにそれ…」「名前は聞いたことあるけど使ったことない」という人向けの記事です。 (Unityでテストしています)

delegateってなに?

delegate(デリゲート)はメソッドを参照するための型です、C言語C++言語やったことある方なら関数ポインターみたいなものという認識でいいと思います。

eventってなに?

event(イベント)はdelegateのプロパティのようなものという認識で大丈夫です。

delegateを使ってみよう

delegateを作ってみましょう。

  //       ↓戻り値    ↓型名    ↓引数
    private delegate void    Del   ();
    Del del;

これでdelegate(デリゲート)の作成ができます。

次にこのdelegateにメソッドを追加してみたいと思います。 戻り値と引数が一致するメソッドしか登録できませんので注意してください。

      // メソッドを追加する場合+=      
    del += メソッド;
      // メソッドを削除する場合-=    
    del -= メソッド;
  private delegate void Del();
    Del del;
    void Start()
    {
        del += test;
        del += test2;
        del();
    }

    void test()
    {
        Debug.Log("呼び出されたよ");
    }
    void test2()
    {
        Debug.Log("こっちも呼び出されたよ");
    }

これでConsoleに"呼び出されたよ""こっちも呼び出されたよ"が表示されるはずです。

eventを使ってみよう

まずはeventを作ってみましょう。

//   ↓ここpublicにしてね
    public delegate void Del();
    public event Del delEvent=null;

public event Del delEvent=null;
Del : 登録したいデリゲート名
delEvent : 型名
これでeventを作成できました。

  public delegate void Del();
    public event Del delEvent=null;

    void Start()
    {
        delEvent += test;
        delEvent += test2;
        delEvent();
    }

    void test()
    {
        Debug.Log("呼び出されたよ");
    }
    void test2()
    {
        Debug.Log("こっちも呼び出されたよ");
    }

呼び出し方も登録の仕方もほぼ同じです。 ただeventを作成したクラス内でしかeventの呼び出しができません。 追加したり削除したりすることしか外部クラスはできなくなっています。 delegateだけですと外部からdelegateを実行できてしまうのでそれを阻止するためのeventです。