C#のデリゲートとは?基本の仕組みと使い方を解説
生徒
「C#のデリゲートって何に使うものなんですか?」
先生
「デリゲートは、メソッドを変数のように扱うためのしくみです。」
生徒
「メソッドを変数みたいに扱うってどういうことですか?想像できません…」
先生
「例えば、ゲームで『攻撃』『回復』『防御』など、状況で実行する操作を切り替えたい場合に、とても便利なんですよ。」
生徒
「なるほど!もっと詳しく知りたいので教えてください!」
1. C#のデリゲートとは?
デリゲート(delegate)とは、C#でメソッド(処理のまとまり)を指し示して、あとから呼び出すための型のことです。メソッドを箱に入れて持ち運ぶようなイメージです。普通はメソッド名を直接書いて呼び出しますが、デリゲートを使うと、どのメソッドを動かすかを柔軟に切り替えられます。
状況によって実行するメソッドが変わる場合に、とても役立ちます。プログラムをより柔軟にし、後から変更しやすくする効果があります。C#のラムダ式やイベント処理とも強く関係している重要な技術です。
2. デリゲートの基本的な書き方
まず最初は、デリゲートがどのように宣言されるのかを見てみましょう。デリゲートは、戻り値と引数の型を指定して宣言します。
delegate void MessageDelegate(string message);
上記は、string型の引数を1つ受け取り、戻り値がない(void)メソッドを入れられるデリゲートです。
3. デリゲートにメソッドを登録して実行する例
実際にメソッドを登録し、実行してみるサンプルを見てみましょう。
using System;
delegate void MessageDelegate(string message);
class Program
{
static void SayHello(string msg)
{
Console.WriteLine("こんにちは! " + msg);
}
static void Main()
{
MessageDelegate del = SayHello;
del("C#デリゲートの世界へようこそ!");
}
}
実行結果:
こんにちは! C#デリゲートの世界へようこそ!
この例では、SayHelloメソッドをMessageDelegate型の変数delに登録し、delとして実行しています。つまり、delを呼び出すとメソッドSayHelloが動きます。これが「メソッドを変数のように扱う」という意味です。
4. デリゲートが役に立つ場面の例
デリゲートは、次のようなシーンでとても便利です。
- 操作の種類を切り替える処理(ゲームの攻撃・回復の切替など)
- 処理をまとめて実行したいとき
- イベント処理(ボタンクリック等)
- プラグイン方式の仕組み
例えば、ゲームのキャラクターの行動を変更するイメージを考えてみましょう。
delegate void ActionDelegate();
static void Attack() { Console.WriteLine("攻撃した!"); }
static void Heal() { Console.WriteLine("回復した!"); }
static void Main()
{
ActionDelegate action = Attack;
action(); // 攻撃
action = Heal;
action(); // 回復
}
攻撃した!
回復した!
状況に応じて、同じ変数actionに入れるメソッドを変更できるので、コードを大きく書き換える必要がありません。これがデリゲートの大きなメリットです。
5. デリゲートを理解するための例え
デリゲートは「テレビのリモコン」に例えると分かりやすいです。リモコンは本体から離れていてもチャンネルを操作できます。リモコンはテレビにどのボタンを押したかを伝えますが、どの番組を映すかはその時次第で変えられます。デリゲートは、この「ボタンの指示」を預かる役割をしています。
つまり、どのメソッドを実行するかを後から選べる「メソッドのリモコン」がデリゲートです。