// マルチキャストのデモ
using System;
namespace Chapter01All
{
// デリゲートの宣言
delegate void StrMod(ref string str);
class StringOps
{
// スペースをハイフンで置き換える
public void ReplaceSpaces(ref string a)
{
Console.WriteLine("Replaces spaces with hyphens.");
a = a.Replace(' ', '-');
}
public void ReplaceHyhoens(ref string a)
{
Console.WriteLine("Replaces hyphens with space");
a = a.Replace('-', ' ');
}
// スペースを取り除く
public void RemoveSpaces(ref string a)
{
string temp = "";
int i;
Console.WriteLine("Removing spaces.");
for (i = 0; i < a.Length; i++)
if (a[i] != ' ') temp += a[i];
a = temp;
}
// 文字列の並びを逆転させる
public void Reverse(ref string a)
{
string temp = "";
int i, j;
Console.WriteLine("Reversing string.");
for (j = 0, i = a.Length - 1; i >= 0; i--, j++)
temp += a[i];
a = temp;
}
static void Main()
{
StringOps obj = new StringOps();
// デリゲートの作成
StrMod strOp;
StrMod replaceSp = obj.ReplaceSpaces;
StrMod removeSp = obj.RemoveSpaces;
StrMod reverseStr = obj.Reverse;
StrMod replacePyhoens = obj.ReplaceHyhoens;
string str = "This is a test";
strOp = replaceSp;
strOp(ref str);
Console.WriteLine(str + "\n"); //spを-に置き換える
// strOp -= replaceSp;
strOp += reverseStr;
strOp(ref str);
Console.WriteLine(str + "\n"); //This-is-a-testを逆文字列にする
strOp += replacePyhoens; //再度逆文字列にするので元に戻る。-をspに変える。
strOp(ref str);
Console.WriteLine(str + "\n");
/* 以下のコメントアウトは最後以外は本の通りです。
str = "This is a test.";
strOp = replaceSp;
strOp(ref str);
Console.WriteLine(str + "\n"); //spを-に変える
// マルチキャストの準備
strOp = replaceSp;
strOp += reverseStr; //←マルチキャストを作成する
// マルチキャストの呼び出し
str = "This is a test.";
strOp(ref str);
Console.WriteLine("Resulting string: " + str);
Console.WriteLine(); //spaceを-に変えて、逆の文字列にする
// 置き換えのメソッドを取り除き、スペース削除のメソッドを追加する
str = "This is a test.";
strOp = replaceSp;
strOp += removeSp; //←別のマルチキャストを作成する
strOp(ref str);
Console.WriteLine(str + "\n");
str = "This is a test."; // 文字列を再度設定する
// マルチキャストの呼び出し
strOp(ref str); //文字列を逆にしてから、spを取る
Console.WriteLine("Resulting string: " + str);
Console.WriteLine();
str = "This-is-a-test.";
strOp = replacePyhoens;
strOp(ref str);
Console.WriteLine(str);
*/
}
}
}
本の例題の通り、打ち込んでは見たけれど、少し分かり辛い。実行部分のコメントアウトは、大体本の通り。実行部分の最初を追加しました。例文のスペースをハイフンに変えて、文字列を逆にする。ハイフンをスペースに変えるのを追加して、再度文字列を逆にすると、元に戻る。マルチキャストは加えていくとそのまま残ってますので、スペースを置き換える手順等が残っていても、一度置き換えると、何度行っても何も起こらないことにはなるようです。文字列を逆にするのは、二回行うと元に戻ることになりますね。