【C#】匿名メソッドの使い方

スポンサーリンク

今回は、聞きなれない単語の『匿名メソッド(無名関数)』についてです。
『匿名メソッド』について、初心者にも分かりやすくサンプルを使って説明していきたいと思います。
今回の例としては、引数にデリゲート(delegate)を使用している関数に対して、匿名メソッドを使って対処していきたいと思います。
内容として「delegate[デリゲート]」をある程度、理解していないと理解に苦しむ可能性があります。
前回の記事を参考にしてください。
【C#】デリゲート(delegate)の使い方 | 育児パパの人生備忘録 (t19488sns.com)

匿名メソッドとは

簡単に言うと「暫定的に関数(メソッド)を定義する」という事です。
※自分は、「関数」と読んでいますが、C#では「メソッド」と呼ばれることが多いです。

使い方

書き方

引数なしの場合

delegate ()
{
    //処理
};

例として、文字列の引数がある場合

delegate (string d) 
{ 
    //処理
};

匿名メソッドでは、関数名は必要ありません。
また、匿名メソッドだけで使用する事は出来ませんので、要注意。
仮にこれだけで書いていると、下記エラーになります。

使用例

まずは、関数を定義します。

private delegate void SampleMethod();

このデリゲートを引数として使う関数を作成(定義)します。

private void Sample(SampleMethod proc)
{
    proc();
}

上記の準備が整ったら、匿名メソッドを使っていきたいと思います。
関数AでSample()という関数を実行します。

private void 関数A()
{
    Sample(
        delegate ()
        {
            /*処理*/
        });
}

インデントを意識して書きましたが、基本的に処理が少ない場合、1行で書いても問題ありません。

private void 関数A()
{
    Sample(delegate () {/*処理*/});
}

サンプルの作成

前回使用したプロジェクトをそのまま流用して、実施していきたいと思います。
【C#】デリゲート(delegate)の使い方 | 育児パパの人生備忘録 (t19488sns.com)

操作画面

簡単にコントロールの説明

textBox1  :入力文字
btnGetRow  :行数を取得する。取得した内容はlabel1に表示する。
btnGetLength:文字数を取得する。取得した内容はlabel2に表示する。
btnBoth   :行数&文字数を取得する。取得した内容はlabel1/label2に表示する。
btnReset  :label1/label2の表示を空白にする。
label1   :行数表示用
label2   :文字数表示用

今回は、このbtnResetを匿名メソッドを使って、修正したいと思います。

定義

前回の内容をそのまま使います。

private delegate void TestProcess(string str);
private void test(string dt,TestProcess proc)
{
    proc(dt);
}

処理の紹介

リセットボタンの処理

リセットボタン[btnReset]がクリックされた時の処理です。
前回までは下記のように書いていました。

private void btnReset_Click(object sender, EventArgs e)
{
    label1.Text = label2.Text = "";
}

これを匿名メソッドを使ってみます。

private void btnReset_Click(object sender, EventArgs e)
{
    test("", delegate (string d) { label1.Text = label2.Text = d; });
}

引数の為にわざわざ関数を定義するのではなく、引数の関数の中で暫定的に関数を定義する事がイメージ的にしっくりくると思います。

まとめ

『匿名メソッド』について紹介しました。
匿名メソッドを使いこなさなくても、アプリケーションを作ることは可能です。
ただ、匿名メソッドという手段を知っている事で、実現させるための手段(方法)が増えるという事だけは覚えててください。
正直、このサンプルではあまりメリットを感じない人も多数いるかもしれません。
プログラムを作るうえで、手段を多数持っていた方が得なのは事実なのです。

コメント

タイトルとURLをコピーしました