【C#】匿名メソッド(無名関数)を定義して使う方法

前回までに最も基本形である「デリゲート」について学びました。このデリゲートを最も基礎の技術としてラムダ式などが派生しています。今回は「匿名メソッド」について紹介していきます。

「匿名メソッド」は「デリゲート」を発展させたものです。デリゲートは確かに便利でしたが、処理ごとにメソッドを定義する必要があるなど、記述量が多くなっているのがデメリットでした。そこで登場したのが「匿名メソッド(無名関数)」と呼ばれるものです。

匿名メソッドは処理の呼び出し元で処理を記述できるので、メソッドを定義する必要がなくなったのが特徴となり、いま多く使われているLINQなどの根底となる考え方になります。

匿名メソッドとは

「匿名メソッド」は「無名関数(英語:anonymous function、nameless function)」とも呼ばれている技術になります。

匿名メソッドは、メソッドの定義をそのままデリゲート変数に代入しておいて、そのデリゲートを呼び出すことで実行することができるというものです。

匿名メソッドを使用することで、デリゲートで参照する処理ロジックを別個に記述する必要がなく、呼び出し元で処理を記述できるようになるので、毎回メソッドの定義を確認して、どのメソッドを使用するかを確認する必要がなくなったのが利点といえるでしょう。

匿名メソッドの書き方

匿名メソッドの基本的な使い方はデリゲートと変わりません。これまでの「デリゲート」と同様に以下の順序で匿名メソッドを使用することができます。

  1. デリゲートを宣言する
  2. 処理を記述する
  3. 必要な箇所に匿名メソッドを書く

匿名メソッドは「メソッド」であるため、処理を引き受けるデリゲート変数は記述する必要があります。匿名メソッドは「実際の処理部分」を「メソッドを定義せずに記述できる」と覚えておきましょう。

では、新規のコンソールアプリケーションを作成して、以下のソースコードを書いてみてください。書き終わったら実際に実行して、書いた処理内容を確認してみましょう。

using System;

namespace App01
{
    class Program
    {
        //デリゲートの宣言
        delegate void Output(string param);

        //デリゲートの実行部分
        static void WriteLoginName(Output method, string param)
        {
            method(param);
        }

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

            //デリゲートを実行する
            WriteLoginName(
                delegate(string output)
                {
                    Console.WriteLine($"Hello, { output }!");
                },
                name);
            Console.ReadLine();
        }
    }
}

まずは復習ということで、デリゲートを定義している箇所から確認します。デリゲート変数の宣言は以下で行われています。今回のデリゲートもvoid型で戻り値を持たず、string型の引数を取るようにしています。

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

このデリゲートを受け取っているのは以下の「WriteLoginName」メソッドになります。この第一引数である「method」でOutputのデリゲートを受け取っています。処理内容は単純にメソッドに第二引数を渡して、処理を実行するシンプルなものです。

//デリゲートの実行部分
static void WriteLoginName(Output method, string param)
{
    method(param);
}

それでもって上記のメソッドを起動させているのがメインの処理部分です。「static void Main(string[] args)」と書かれているメソッドが該当します。これはコンソールアプリケーションのメインエントリポイントでもあります。

//デリゲートを実行する
WriteLoginName(
    delegate(string output)
    {
        Console.WriteLine($"Hello, { output }!");
    },
    name);

「WriteLoginName」の第一引数は「Output」のデリゲートでした。この第一引数部分が「匿名メソッド」になります。書き方は「delegate (引数){ 処理 }」となります。

delegate(string output)
{
    Console.WriteLine($"Hello, { output }!");
}

こうしてみると分かる通り、「匿名メソッド」ではメソッド名がなく、「delegate」キーワード以降が直接の処理内容となります。今回の「匿名メソッド」の処理内容は引数の前に「Hello,」を付けてコンソール画面に出すだけです。

また注意すべきは戻り値を記述する部分のシグネチャがないことです。このサンプルでは戻り値を持たない処理となっていますが、delegateの後に「void」と記述していません。これは戻り値を持っている場合でも記述不要となる項目なので忘れないようにしてください。