C# – 細かく「delegate」Part.2

前回の続きです。

delegateができること

delegateキーワードで定義した型はSystem.Delegateクラスの派生クラスになる。
よって、System.Delegateクラスが持つプロパティやメソッドを持ち、
共通言語ランタイムによってBeginInvokeメソッドとEndInvokeメソッドが提供されるようです。

具体的には次のようなことが可能になる。

メソッドを呼び出せる

delegateで定義された型はメソッドを表すので、そこに代入されたメソッドを参照し利用できる。

例えば、次のようなコードを実行すると

public class DelegateSample01 {
    //SampleDelegate型の定義
    delegate void SampleDelegate(string str);
    //SampleDelegate型のsample変数の宣言
    static SampleDelegate sample;
    
    public static void Main(){
        var text = "出力して欲しい物";
        //SampleDelegate型のsample変数にstatic void Write(string)メソッドの代入
        sample = Write;
        //sample変数に代入されたメソッドを参照呼出し
        sample(text);
    }
    public static void Write(string text){
        System.Console.WriteLine(text);
    }
}

出力:

出力して欲しい物

となる。
このコード自体に意味はない。重要なのは12行目にある、

sample(text);

である。上記のように記述することで、10行目にsample変数に代入したstatic void Write(string)メソッドを呼び出すことが出来る。

メソッドを引数にできる

メソッドとしての型を定義しているので、その型の変数を引数として利用できる。
例えば次のクラスを定義し、

//SampleDelegate型の定義
public delegate void SampleDelegate(string str);

public class SampleClass{
    public void SampleMethod(SampleDelegate sample){
        var text = "出力して欲しい物";
        //引数のsample変数によって引き渡されたメソッドを参照呼出し
        sample(text);
    }
}

次のように実行すると

public class DelegateSample02 {
    public static void Main(){
        //クラスのインスタンス生成
        var sampleClass = new SampleClass();
        //static Write(string)メソッドを引数としてメソッド呼び出し
        sampleClass.SampleMethod(Write);
    }
    public static void Write(string text){
        System.Console.WriteLine(text);
    }
}

出力:

出力して欲しい物

となる。SampleClass.csの5行目にあるSampleClass.SampleMethod(SampleDelegate)メソッドの引数として、メソッドの参照を渡すことができる。

このコード自体にも意味はないが、意識する点はSampleClass.csの2行目にあるデリゲートの定義のスコープが他のクラスで利用するのでpublicとなっている点である。

次回へ続く

カテゴリーC#

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です