変数と型について
変数とはオブジェクトにつけられた名前です。たとえば次のコードでは、0 というオブジェクトに i という名前をつけています。これ以降、i は 0 を表します。また変数は入れ物にもたとえられ、「i に 0 を入れる」とも言われます。
i の前に書かれている int は、i の型を表します。オブジェクトにはそれぞれそのオブジェクトの使用法を示す型(type)があります。int は int 型のことで、int.MinValue から inv.MaxValue までの範囲をとる整数型です。
この例の場合は int 型のオブジェクトを int 型の変数に入れているので、オブジェクトのすべての能力にアクセスできますが、あえてそのオブジェクトの一部の能力のみ使用するよう、別の型の変数に入れることもできます。これを「オブジェクトを別の型にキャストする」と呼びます。
デリゲートについて
デリゲートは関数の一種です。C# の関数には、メソッド、コンストラクタ、プロパティ、ローカル関数などの種類があり、その中にデリゲートも含まれます。
デリゲートの特徴は、他の関数を複数登録して順次呼び出すことができることです。例えば次のコードは "Hello" と "World" を順次表示します。
C#
1Action action1 = () => Console.WriteLine("Hello");
2Action action2 = () => Console.WriteLine("World");
3Action action3 = action1 + action2;
4action3();
デリゲート変数について
デリゲート変数はデリゲートが入っている変数です。
デリゲート型について
デリゲート型は型のうち、デリゲートを表すものの総称です。
デリゲート型は、以下のように delegate キーワードを使って宣言し、それに従ってデリゲートを定義し、呼び出します。
C#
1// デリゲート型 IntBinaryOperation の宣言
2delegate int IntBinaryOperation(int a, int b);
3
4static void Main(string[] args)
5{
6 // デリゲート add の定義
7 IntBinaryOperation add = (a, b) => a + b;
8
9 // デリゲート呼び出し
10 Console.WriteLine(add(2, 3));
11}
Func, Action について
Func, Action はジェネリックで宣言済みのデリゲート型で、汎用的に使うことができます。
これを使うことにより、その場にふさわしいデリゲート型をわざわざ宣言しなくても、デリゲートを定義することができます。
Func は戻り値のあるデリゲート型で、Action は戻り値の無いデリゲート型です。
たとえば先ほどのように IntBinaryOperation を宣言しなくても、次のように同じことができます。
C#
1static void Main(string[] args)
2{
3 // デリゲート add の定義
4 Func<int, int, int> add = (a, b) => a + b;
5
6 // デリゲート呼び出し
7 Console.WriteLine(add(2, 3));
8}
Delegate について
delegate はデリゲートを宣言するのに使用するキーワードでしたが、この頭を大文字にした Delegate は型の名前です。すべてのデリゲートは Delegate 型から派生します。
よって、すべてのデリゲートは Delegate 型にキャストすることができます。
C#
1// デリゲート型 IntBinaryOperation の宣言
2delegate int IntBinaryOperation(int a, int b);
3
4static void Main(string[] args)
5{
6 // デリゲート add の定義
7 IntBinaryOperation add = (a, b) => a + b;
8
9 // add を Delegate 型にキャストして Delegate 型の変数 add2 に入れる
10 Delegate add2 = add;
11
12 // add2 の呼び出し(Delegate 型にキャストしているのでコンパイルエラーになる)
13 Console.WriteLine(add2(2, 3));
14
15 // Delegate 型は次のように呼び出す
16 Console.WriteLine(add2.DynamicInvoke(2, 3));
17}
まとめ
- デリゲートは関数の一種であり、ほかの関数を呼び出すことができる
- デリゲート型はデリゲートの型を示す総称である
- デリゲート変数はデリゲートを入れる変数である
- delegate はデリゲート型を宣言する時に使うキーワードである
- Delegate 型はすべてのデリゲート型の先祖である
- Func, Action はデリゲート型のバリエーションである