C#のデリゲートチェーン(複数デリゲートの連結)をやさしく完全解説
生徒
「C#のデリゲートって、1つの処理しか登録できないんですか?」
先生
「実は、デリゲートには複数の処理をまとめて登録することができます。」
生徒
「まとめて? それってどういう意味ですか?」
先生
「それを『デリゲートチェーン』と呼びます。順番に処理を実行できて、とても便利ですよ。」
1. デリゲートチェーンとは?
C#のデリゲートチェーンとは、1つのデリゲートに対して複数のメソッド(処理)を連結して登録する仕組みのことです。 デリゲートは「メソッドを入れておく箱」のような存在ですが、その箱には実は1つだけでなく、複数のメソッドを入れることができます。
プログラミング未経験の方は、「1回ボタンを押したら、いくつかの作業が順番に行われる」とイメージすると分かりやすいです。 例えば、スイッチを押すと、電気がついて、音楽が流れて、画面が表示されるような仕組みと似ています。
2. デリゲートのおさらい
まず、デリゲートの基本を簡単に確認します。 デリゲートとは、メソッドを変数のように扱うための仕組みです。 難しく聞こえますが、「あとで実行する処理を、あらかじめ登録しておくもの」と考えてください。
delegate void MyDelegate();
このコードは、「引数なし・戻り値なしのメソッドを登録できるデリゲート」を定義しています。 delegateというキーワードが出てきましたが、これは「代理」「代わりに実行する」という意味があります。
3. デリゲートにメソッドを1つ登録する
まずは、1つのメソッドをデリゲートに登録する基本的な例を見てみましょう。
static void Hello()
{
Console.WriteLine("こんにちは");
}
MyDelegate d = Hello;
d();
こんにちは
この例では、Helloというメソッドをデリゲートに登録しています。
そして d() と書くことで、中身に登録されている処理が実行されます。
4. デリゲートチェーンで複数の処理を連結する
ここからが本題です。 デリゲートは、「+」や「+=」を使って、複数のメソッドをつなげることができます。 これがデリゲートチェーンです。
static void Hello()
{
Console.WriteLine("こんにちは");
}
static void Goodbye()
{
Console.WriteLine("さようなら");
}
MyDelegate d = Hello;
d += Goodbye;
d();
こんにちは
さようなら
実行結果を見ると、登録した順番通りに処理が実行されていることが分かります。 このように、1回の呼び出しで複数の処理をまとめて実行できるのが、デリゲートチェーンの大きな特徴です。
5. 「+=」と「-=」の意味
デリゲートチェーンでは、+= と -= という記号を使います。 これは算数の足し算・引き算ではなく、「登録する」「取り除く」という意味で使われます。
d -= Hello;
d();
さようなら
この例では、Helloの処理だけがチェーンから外れています。
つまり、デリゲートチェーンは後から自由に追加・削除ができる柔軟な仕組みなのです。
6. デリゲートチェーンが使われる場面
デリゲートチェーンは、特にイベント処理でよく使われます。 イベントとは、「ボタンが押された」「データが変更された」などの出来事のことです。
1つの出来事に対して、画面更新・ログ記録・通知表示など、複数の処理を行いたい場合があります。 そんなときに、デリゲートチェーンを使うと、処理をきれいにまとめることができます。
7. 初心者がつまずきやすいポイント
初心者の方が混乱しやすいのは、「なぜ全部実行されるのか?」という点です。 デリゲートチェーンでは、最後の1つだけでなく、登録されているすべてのメソッドが実行されます。
また、戻り値があるデリゲートの場合は、最後に登録されたメソッドの戻り値だけが使われるという特徴もあります。 今回は基本理解を目的としているため、戻り値なしの例で説明しています。
8. ラムダ式とデリゲートチェーン
デリゲートチェーンには、ラムダ式も登録できます。 ラムダ式とは、「その場で簡単に処理を書く方法」です。
MyDelegate d = () => Console.WriteLine("処理A");
d += () => Console.WriteLine("処理B");
d();
処理A
処理B
このように書くと、短い処理をわざわざメソッドとして作らなくても済みます。 デリゲートチェーンとラムダ式は、非常に相性の良い組み合わせです。