delegate 演算子

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!

これは、ラムダ式でサポートされていない匿名メソッドの唯一の機能です。 それ以外の場合は、すべてラムダ式を使用してインライン コードを書くことをお勧めします。

C# 9.0 以降では、破棄を使用して、メソッドで使用しない匿名メソッドの 2 つ以上の入力パラメーターを指定できます。

Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4));  // output: 42

下位互換性のために、1 つのパラメーターにのみ _ という名前が付けられた場合、_ は匿名メソッド内でそのパラメーターの名前として扱われます。

また、C# 9.0 以降では、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# 言語仕様」の無名関数の式に関するセクションを参照してください。

関連項目