C# ゼロから理解するラムダ式:デリゲートをメソッドの引数にする方法 #5

前回の「C# ゼロから理解するラムダ式:C#でデリゲートを書く方法 #4」では「デリゲート」の基礎的の使い方について解説しました。前回のような使い方では、あまり利便性を感じられなかったかもしれませんね。

そこで今回は、もう少し議論を先に進めるために、デリゲートをメソッドの引数にする方法を紹介します。メソッドに対してデリゲートを引き渡すイメージを付けることができれば、これから先の内容もスムーズに理解できるようになるはずです。

デリゲートを引数にする方法

では早速、デリゲートをメソッドの引数のする方法に取り組んでいきましょう。早速、新しいコンソールアプリケーションを作成して以下のソースコードを記述して実行してみてください。

using System;

namespace App02
{
    class Program
    {
        // デリゲートの宣言部分
        delegate void Output(string name);

        // デリゲートの実処理部分
        private static void WriteHello(string name)
        {
            Console.WriteLine($"Hello, { name }!");
        }

        // デリゲートを実行させるメソッド
        private static void OutputProcessor(Output method, string param)
        {
            //デリゲートに引数を渡して実行する
            method(param);
        }

        // メイン処理実行部分
        static void Main(string[] args)
        {
            Console.WriteLine("ログイン名を入力してください。");
            var name = Console.ReadLine();

            //メソッドに処理とパラメーターを渡して実行させる
            OutputProcessor(WriteHello, name);

            Console.ReadLine();
        }
    }
}

ソースコードが記述できたら、実際に起動してコンソールアプリケーションを動かしてみてください。それでは先ほどのソースコードを解説していきます。

メインの処理について

まずはメインで処理が起動される部分に着目して処理を追っていきます。メイン処理の部分は以下の箇所が該当します。

// メイン処理実行部分
static void Main(string[] args)
{
    Console.WriteLine("ログイン名を入力してください。");
    var name = Console.ReadLine();

    //メソッドに処理とパラメーターを渡して実行させる
    OutputProcessor(WriteHello, name);

    Console.ReadLine();
}

はじめの2行は無視をするとして、以下の箇所がデリゲートを引数で渡している箇所になります。「WriteHello」メソッドはデリゲートの実処理部分になります。

//メソッドに処理とパラメーターを渡して実行させる
OutputProcessor(WriteHello, name);

ここは普通のメソッドを呼び出しているのと同じ記述内容ですね。一つ目の引数がデリゲートになっているだけが、普段のメソッドと違うところかもしれませんね。

デリゲートの実行部分について

少し目を動かして、このメソッドの記述内容を見てみましょう。デリゲートを引数で受けているメソッドは以下のように記述されていました。

// デリゲートを実行させるメソッド
private static void OutputProcessor(Output method, string param)
{
    //デリゲートに引数を渡して実行する
    method(param);
}

「OutputProcessor」メソッドの一つ目の引数は「Output」という型になっています。これはデリゲートの宣言部分にて定義しているデリゲート型の変数です。Outputというデリゲート型の変数は以下で定義されています。

  • 戻り値を持たないvoid型である
  • string型の引数を一つ取る

このメソッドであれば受け取れることが分かります。そのデリゲートに該当するのが「WriteHello」メソッドに該当するということになります。外側から引き渡されたデリゲートは「method」という変数名で処理を引き受けています。

前回の「C# ゼロから理解するラムダ式:C#でデリゲートを書く方法 #4」の内容でも触れているデリゲートの形式で引き渡されたメソッドを実行するのみになります。2つ目の引数である「param」をmethodの引数として渡して処理を実行させるようにするだけです。

//デリゲートに引数を渡して実行する
method(param);

該当箇所は上記になります。デリゲート型の変数はメソッドと同様に使用することができるので、変数のように見えますが引数を渡して処理を実行することができます。

デリゲートの定義・実行部分について

一番最後となってしまいましたが、先ほどの「OutputProcessor」メソッドの一つ目の引数である「Output」はデリゲートの型になります。このメソッドを引き受けるデリゲートの定義部分が以下です。

// デリゲートの宣言部分
delegate void Output(string name);

これも前回の「C# ゼロから理解するラムダ式:C#でデリゲートを書く方法 #4」と同様に以下の特徴を持つデリゲートとなっています。

  • void型であること
  • string型の引数を1つ取ること

そして、このデリゲートに対応するのが以下のソースコードになります。メイン処理部分に記述されている「OutputProcessor(WriteHello, name);」の「WriteHello」に該当する部分ですね。

// デリゲートの実処理部分
private static void WriteHello(string name)
{
    Console.WriteLine($"Hello, { name }!");
}

このメソッドは単純に引数に対してメッセージを追加してコンソール画面に表示させるという、とてもシンプルな内容となっています。あまり迷わないと思います。

以上、ここまでがデリゲートをメソッドの引数にする方法の解説でした。ここまで理解できていれば、デリゲートに関しては十分に思います。後は戻り値を持つ場合などのバリュエーションを増やしていくだけになります。

ここまで理解できればデリゲートの理解はおおむね問題ないといってよいかと思います。基本は理解されているので、このまま順調に学習を進めてもらえれば大丈夫ですね。引き続き頑張っていきましょう。