読者です 読者をやめる 読者になる 読者になる

プログラミングでアイデアを具現化したい

あらゆるものを具現化するためにプログラミングを始めました。主にC#

マルチキャスト

C#


独習C# 第3版より

tos5511.hatenablog.com
デリゲートの続き。
デリゲートの呼び出し時に一度に複数メソッドをまとめて呼び出すことを
マルチキャストという。デリゲートをインスタンス化した後、「+=」「-=」で
メソッドの追加、削除を行いメソッドをチェーンで呼び出す事ができる。

// マルチキャストのデモ

using System;

// デリゲートの宣言
delegate void StrMod(ref string str);

class StringOps {
    // スペースをハイフンで置き換える
    static void ReplaceSpaces(ref string a) {
        a = a.Replace(' ', '-');
    }
    
    // スペースを取り除く
    static void RemoveSpaces(ref string a) {
        string temp = "";
        int i;
        for (i = 0; i < a.Length; i++)
            if (a[i] != ' ') temp += a[i];
        a = temp;
    }
    // ハイフンを取り除く
    static void RemoveHihun(ref string a) {
        string temp = "";
        int i;
        for (i = 0; i < a.Length; i++)
            if (a[i] != '-') temp += a[i];
        a = temp;
    }

    // 文字列の並びを逆転させる
    static void Reverse(ref string a) {
        string temp = "";
        int i, j;
        for (j = 0, i = a.Length - 1; i >= 0; i--, j++)
            temp += a[i];
        a = temp;
    }

    static void Main() {
        // デリゲートの作成
        StrMod strOp;
        StrMod replaceSp = ReplaceSpaces;
        StrMod removeSp = RemoveSpaces;
        StrMod reverseStr = Reverse;
        StrMod removeHi = RemoveHihun;
        string str = "123 456 789 デリゲート テスト";

        // マルチキャストの準備
        strOp = replaceSp;
        strOp += reverseStr; //←マルチキャストを作成する

        // マルチキャストの呼び出し
        strOp(ref str);
        Console.WriteLine(str);

        // 置き換えのメソッドを取り除き、スペース削除のメソッドを追加する
        strOp -= replaceSp;
        strOp += removeHi; //←別のマルチキャストを作成する

        // マルチキャストの呼び出し
        strOp(ref str);
        Console.WriteLine(str);
    }
}

実行結果
f:id:tos5511:20160110221119j:plain


コード解説

// デリゲートの作成
StrMod strOp;
StrMod replaceSp = ReplaceSpaces;
StrMod removeSp = RemoveSpaces;
StrMod reverseStr = Reverse;
StrMod removeHi = RemoveHihun;

まず、デリゲートを参照する変数を4つ作成。
strOpには何も代入せず、

// マルチキャストの準備
strOp = replaceSp;
strOp += reverseStr; 

strOpにデリゲート参照変数を追加することで

// マルチキャストの準備
strOp(ref str);

ReplaceSpaces()とReverse()を呼び出すマルチキャストが作成されています。