Part.1はこちら
Part.2はこちら
Part.3はこちら
Part.4はこちら
Part.5(この記事)
delegateをつかうとき
これまででデリゲートが出来ることをまとめた。
デリゲートは戻り値と引数を定義してやることで、定義した戻り値と引数を持つメソッドの変数を宣言できることがわかった。
しかし、実際に使用する場合では、自分でデリゲートを定義することはなく標準ライブラリが提供している「汎用デリゲート」を使うことになる(と思う)。
事実、今までのサンプルコードで登場してきたデリゲートの型も、標準ライブラリで「よく使うデリゲート型」である汎用デリゲートとして既に定義され提供されているのだ。
以下に汎用デリゲートの簡単な説明と、実際に利用するパターンを示す。
汎用デリゲート
汎用デリゲートは一部を除きジェネリクスクラスで、以下のようなものがSystemにて定義されている。
用途 | 引数 | 定義 |
戻り値 なし |
なし | void Action() |
あり | void Action<T[, …]>(T obj[, …]) | |
戻り値 あり |
なし | TResult Func<TResult>() |
あり | TResult Func<T[, …], TResult>(T arg[, …]) | |
比較 | 2つ | int Comparison<T>(T x, T y) |
型変換 | 1つ | TOutput Converter<TOutput,TInput>(TInput input) |
条件 | 1つ | bool Predicate<T>(T obj) |
上記表の用途と引数に従って選べば、機能するものが利用できる。また、Action<T>とFunc<T,TResult>の引数は4つまで増やすことが出来る(C#4.0以降なら16まで対応)。
この汎用デリゲートを踏まえて、Part.2で出したDelegateSample01.csのvoid SampleDelegate(string)はAction<T>を利用すると次のように書ける。
public class DelegateSample01alpha { //Action<string>型のsample変数の宣言 static System.Action<string> sample; public static void Main(){ var text = "出力して欲しい物"; //Action<string>型のsample変数にstatic void Write(string)メソッドの代入 sample = Write; //sample変数に代入されたメソッドを参照呼出し sample(text); } public static void Write(string text){ System.Console.WriteLine(text); } }
出力:
出力して欲しい物
変更点は独自に定義したデリゲートSampleDelegate型の定義を消し、sample変数をAction<string>型にしただけだ。
このように独自にデリゲートの型を定義せずとも、標準ライブラリとして用意されている汎用デリゲートを用いることで、デリゲートの性質を利用することが出来るのである。