delegate
演算子は、デリゲート型に変換できる匿名メソッドを作成します。 匿名メソッドは、多くのメソッドの引数として使用される System.Action 型や System.Func<TResult> 型などに変換できます。
Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4)); // output: 7
注
ラムダ式は、匿名関数を作成するためのより簡潔で表現力の高い方法を提供します。 => 演算子を使用してラムダ式を作成します。
Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4)); // output: 7
ラムダ式の機能 (外部変数のキャプチャなど) の詳細については、「 ラムダ式」を参照してください。
delegate
演算子を使用する場合は、パラメーター リストを省略できます。 その場合、次の例に示すように、作成された匿名メソッドは、パラメーターの任意のリストを持つデリゲート型に変換できます。
Action greet = delegate { Console.WriteLine("Hello!"); };
greet();
Action<int, double> introduce = delegate { Console.WriteLine("This is world!"); };
introduce(42, 2.7);
// Output:
// Hello!
// This is world!
これは、ラムダ式でサポートされていない匿名メソッドの唯一の機能です。 それ以外の場合は、ラムダ式を使用してインライン コードを記述することをお勧めします。 破棄を使用して、メソッドで使用されない匿名メソッドの 2 つ以上の入力パラメーターを指定できます。
Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4)); // output: 42
下位互換性のために、 _
という名前のパラメーターが 1 つだけの場合、 _
は匿名メソッド内でそのパラメーターの名前として扱われます。
匿名メソッドの宣言では、 static
修飾子を使用できます。
Func<int, int, int> sum = static delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(10, 4)); // output: 14
静的匿名メソッドでは、スコープを囲むローカル変数またはインスタンスの状態をキャプチャできません。
また、 delegate
キーワードを使用して デリゲート型を宣言します。
C# 11 以降では、コンパイラはメソッド グループから作成されたデリゲート オブジェクトをキャッシュできます。 次の方法について考えてみましょう。
static void StaticFunction() { }
メソッド グループをデリゲートに割り当てると、コンパイラはデリゲートをキャッシュします。
Action a = StaticFunction;
C# 11 より前は、ラムダ式を使用して 1 つのデリゲート オブジェクトを再利用する必要があります。
Action a = () => StaticFunction();
C# 言語仕様
詳細については、「C# 言語仕様」の無名関数の式に関するセクションを参照してください。
こちらも参照ください
.NET