半人前プログラマーの技術談議

開発した物と,C#を入門者向けに解説した記事を書いています!

【C# デリゲート】delegate Func Action ラムダ式 part5

calendar

reload

【C# デリゲート】delegate Func<T> Action<T> ラムダ式 part5

こんにちは!シロウです!

今回はデリゲートについて紹介します.

デリゲート

概要

デリゲートは,メソッドをデータ型にしたものです.

delegate型の変数にメソッドを代入することができます.

但し,条件があります.

それは,delegate型の変数と,代入するメソッドが同じ構造(シグニチャー)を持つ必要があります.

具体的には,

戻り値の型が一致していることと,

引数の個数とその型が一致している必要があります.

デリゲートの宣言は次のようになります.

また,デリゲートはあくまで型なので,

int型の変数を定義するように,宣言したデリゲート名で変数を定義する必要があります.

(それぞれのメソッドに合った型を自作しているというと考えやすいかもしれません.)

 

実際に,サンプルプログラムで動作を見ていきます.

 

実行結果

戻り値のデータ型はint型,引数は1つでint型のFunctionデリゲートを宣言して,

Functionデリゲートからfunc変数を定義します.

func変数には,同じシグニチャーを持つCalcメソッドを代入し,

func変数からCalcメソッドを参照して,5を代入して結果を出力します.

 

実は,デリゲートは参照型で,func変数にはCalcメソッドの参照先を渡しています.(詳しくはこちら

 

また,変数と同じように値の変更(再代入)ができます.

 

実行結果

 

Funcデリゲート

delegate型を使ってデリゲートを宣言してその後に変数を定義するのは少々手間です.

その手間を省く為に,Func<T>というデリゲートの定義を使います.

Func<T>は戻り値のあるデリゲートで,Tは任意の型を指します.

また,いくつかパターンがあります.

  • Func<T>は,引数を受け取らずに,戻り値がTの型になるデリゲート.
  • Func<T1, T2>は,引数T1を受け取り,戻り値がT2の型になるデリゲート.
  • Func<T1, T2>は,引数T1, T2を受け取り,戻り値がT3になるデリゲート.

例えば,Func<int, int>の場合,int型の引数を受け取り,int型の戻り値を持ちます.

 

実際に,サンプルプログラムで動作を見ていきます.

 

実行結果

このように,delegateの宣言を省略することができます.

 

Actionデリゲート

Actionデリゲートは戻り値を持たない(void型)デリゲートです.

Funcデリゲートと使い方は同じです.

  • Actionは,引数を受け取らずに処理を行うデリゲート.
  • Action<T>は,引数Tを受け取って処理を行うデリゲート.
  • Action<T1, T2>は,引数T1, T2を受け取って処理を行うデリゲート.

 

ラムダ式

ラムダ式を使うと,メソッドを別途で作成する必要はなくなります.

ラムダ式は,アロー演算子というものを使います.ラムダ式専用の演算子です.

アロー演算子は,「=>」と記述します.

アロー演算子の左辺は引数で,右辺が処理になります.

 

実際に,サンプルプログラムで確認してみます.

 

実行結果

 

また,引数が複数ある場合は()で囲んで「,」で区切ります.

 

実行結果

 

処理が複数行の場合は,{}で囲んでブロック文にします.

 

実行結果