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

前回の続きです。

Part.1はこちら

delegateができること

複数のメソッドを持つ

今までデリゲートには「=」演算子でメソッドを代入してきたが、
「+=」演算子で複数のメソッドを代入することが出来る。
この状態のデリゲートを「マルチキャストデリゲート」と呼ぶらしい。

例えば、次のようなコードを書くと

public class DelegateSample03 {
    //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変数にstatic void DoubleWrite(string)メソッドの追加代入
        sample += DoubleWrite;
        //sample変数に代入されたメソッドを参照呼出し
        sample(text);
    }
    public static void Write(string text){
        System.Console.WriteLine(text);
    }
    public static void DoubleWrite(string text){
        System.Console.WriteLine(text + text);
    }
}

出力:

出力して欲しい物
出力して欲しい物出力して欲しい物

となる。
しつこいようだが、このコード自体に意味はない。

DelegateSample03.csの12行目で「+=」演算子を用いてstatic void DoubleWrite(string)メソッドを代入することで、出力の2行目に「出力して欲しい物出力して欲しい物」が出力されている。

マルチキャストデリゲートでメソッドを呼び出す時、
メソッドの処理は並列に行われるわけではなく、代入した順に順番に実行される。

また、マルチキャストデリゲートに「-=」演算子を用いることで代入したメソッドを削除することもできる。
例えば先ほどのDelegateSample03.csに用いてみると、

public class DelegateSample03plus {
    //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変数にstatic void DoubleWrite(string)メソッドの追加代入
        sample += DoubleWrite;
        //static Write(string)メソッドを削除
        sample -= Write;
        //sample変数に代入されたメソッドを参照呼出し
        sample(text);
    }
    public static void Write(string text){
        System.Console.WriteLine(text);
    }
    public static void DoubleWrite(string text){
        System.Console.WriteLine(text + text);
    }
}

出力:

出力して欲しい物出力して欲しい物

となる。
DelegateSample03plus.csの14行目を追加することで、先ほどは呼び出されていたstatic void Write(string)メソッドが呼び出されないことがわかる。

次回へ続く

カテゴリーC#

コメントを残す

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