C#のdelegateでできることは?便利な使い方やラムダ式についても紹介

C#のdelegateでできることは?便利な使い方やラムダ式についても紹介のアイキャッチイメージ

C#のdelegateとは?


C#にはdelegateという文法があります。delegateとは日本語で「委譲」と訳され、任せるという意味になります。その通りに、C#のdelegateはメソッドを代入してその処理を「おまかせ」することができるのです。

delegateはC言語の関数ポインタという機能によく似ているのですが、この記事を読む人はC言語を知らない人も多いでしょう。そんな方々にもわかるように説明するので、是非この記事を読んでdelegateについて知って下さい。

C#のdelegateの基本的なサンプルプログラム


以下がC#のdelegateのシンプルなサンプルプログラムです。

実行結果は、以下が表示されます。

C#のdelegateで可能なこと4選


C#でdelegate型の変数にstaticな静的メソッドやクラスのインスタンスの動的メソッドを代入できます。またメソッドの追加や削除を動的に行うことができます。

1:メソッドの処理ができる

上の例について説明すると、delegateのDelegateMethodにShowNumという普通のメソッドを代入して、DelegateMethodの実体のdmを呼ぶことでShowNumが呼び出されるという流れです。

newで宣言しているのに「代入」と言いましたが、実際にnewしている箇所を以下のように記述することも可能です

2:インスタンスメソッドを代入できる

C#のdelegateにはstaticな静的メソッドだけでなく、クラスのインスタンスの動的メソッドも代入できます。以下のように行います。

HumanクラスのインスタンスhuのメソッドShowMesを、delegateのdmに代入しています。これを実行すれば以下のように表示されます。

3:複数のメソッドを代入できる

C#のdelegateには複数のメソッドを追加できます。上のMainメソッドを以下のように変更し、ShowSpringというメソッドを追加しましょう。

これを実行すると以下のように表示されます。

4:追加したメソッドを除去できる

delegateに+=でメソッドを追加すると、連続で実行されます。ただし引数と戻り値が同じタイプのメソッドしか追加できません。この例では追加するメソッドに引数がある場合や、戻り値がvoidではないメソッドを追加しようとしてもエラーになります。

またdelegateには+=による追加だけでなく-=による除去もできます。Mainメソッドを以下のように変えてみましょう。

結果は以下のようになります。

-=により2つあったメソッドが1つになったということです。

C#のdelegateの便利な使い方4つ


C#でdelegateを使用して条件判断処理を差し替える例を提示して、匿名関数を使用するように修正したり定義済みdelegateを利用するように修正してみます。またdelegateを使用したコールバック関数の例も提示します。

1:条件判断処理を差し替える

C#のdelegateは以下のようなケースで役に立ちます。

上のサンプルプログラムを実行すると、以下のように表示されます。

処理の流れは以下の通りです。

1.delegateのJudgeMethodにJudgeOver5を代入する。

2.JudgeOver5の判断で配列のaryの中から5より大きい値を取り出す。

3.JudgeMethodにJudgeUnder5を代入する。

4.JudgeUnder5の判断でaryの中から5より小さな値を取り出す。

このようにC#のdelegateは条件判断の処理を差し替えたい時に、便利に使えるのです。

2:匿名関数で代入するメソッドを省略する

上のサンプルのJudgeOver5やJudgeUnder5のような1行で済む短いメソッドはもっとコンパクトにすることができます。それが匿名関数です。上のサンプルのjmにJudgeOver5とJudgeUnder5を代入している箇所は、以下のように記述できます。

これでJudgeOver5とJudgeUnder5は不要になります。

3:コールバック関数を代入する

コールバック関数とは非同期処理が終了した時に通知を行う関数のことです。
ここではdelegateを使用して、DoCallBackをコールバック関数として使用するC#のサンプルコードを示します。

4:定義済みdelegateを利用する

delegate bool JudgeMethod(int num);の様にユーザが独自にdelegateを定義することも可能ですが、よく使用されるものは定義済みdelegateとして事前に用意されています。

ここではC#のFunc型変数を利用した例を示します。

Func型変数

Func型とは、任意のデータ型の戻り値があり0~16個の任意のデータ型の引数を持つことができるデリゲートです。

「条件判断処理を差し替える」のC#のサンプルコードは以下の様に修正できます。

上のサンプルプログラムを実行すると、以下のように表示されます。

C#のdelegateとあわせて覚えておきたいラムダ式


C#でFunc型変数を使用した場合、匿名メソッドを利用した場合とラムダ式を使用した場合の違いは以下の様になります。

Func型変数を使用した場合の例は以下になります。
・参照されるメソッド。

・Func型変数の宣言

匿名メソッドを利用したコードの例は以下になります。

ラムダ式を使用した場合の例は以下になります。

メソッドを独立して定義する必要はなく、その場でメソッドの内容を記述します。

ラムダ式の使い方

「Func型変数」のC#のサンプルコードは以下の様に修正できます。

上のサンプルプログラムを実行すると、以下のように表示されます。

C#のdelegateを使ってみよう


ここまでC#でdelegateを使用する例を提示してきました。基本的な使い方から動的にメソッドを追加して連続処理を行ったり、動的に条件判断処理を変更する例などを示してきました。

delegateの委譲という考え方もC#の理解を深めるのに役立つので、是非マスターしてください。

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。