C# 匿名メソッド
C# では、匿名関数は名前のないメソッドであり、コード内で定義して使用できます。
既に述べたように、デリゲートは同じシグネチャを持つメソッドを参照するために使用されます。言い換えれば、デリゲートオブジェクトを使用して、デリゲートが参照できるメソッドを呼び出すことができます。
匿名メソッド(Anonymous methods)デリゲートのパラメータとしてコードブロックを渡す技術を提供します。
匿名メソッドでは戻り値の型を指定する必要はなく、メソッド本体の return ステートメントから推論されます。
Lambda 式
Lambda 式は匿名関数を作成するための簡潔な構文です。通常、LINQ クエリやデリゲートで使用されます。
構文
(parameters) => expression
// 或
(parameters) => { statement; }
例
// 例:Lambda 式を使用してデリゲートを定義する
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(2, 3)); // 5 を出力
// 例:Lambda 式を使用して配列の要素をフィルタリングする
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // 2 4 を出力
}
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(2, 3)); // 5 を出力
// 例:Lambda 式を使用して配列の要素をフィルタリングする
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // 2 4 を出力
}
匿名メソッド
匿名メソッドは、次のものを使用してdelegateキーワードを使用してデリゲートインスタンスを作成することによって宣言されます。
構文
delegate(parameters) { statement; }
例えば:
delegate void NumberChanger(int n);
...
NumberChanger nc = delegate(int x)
{
Console.WriteLine("Anonymous Method: {0}", x);
};
コードブロックConsole.WriteLine("Anonymous Method: {0}", x);は匿名メソッドの本体です。
デリゲートは匿名メソッドでも名前付きメソッドでも呼び出すことができます。つまり、デリゲートオブジェクトにメソッドパラメータを渡すことによって呼び出します。
注意:匿名メソッドの本体の後には、...が必要です。;。
例えば:
nc(10);
例
// 例:匿名メソッドを使用してデリゲートを定義する
Func<int, int, int> multiply = delegate (int a, int b)
{
return a * b;
};
Console.WriteLine(multiply(2, 3)); // 6 を出力
// 例:匿名メソッドをイベントハンドラとして使用する
Button button = new Button();
button.Click += delegate (object sender, EventArgs e)
{
Console.WriteLine("Button clicked!");
};
Func<int, int, int> multiply = delegate (int a, int b)
{
return a * b;
};
Console.WriteLine(multiply(2, 3)); // 6 を出力
// 例:匿名メソッドをイベントハンドラとして使用する
Button button = new Button();
button.Click += delegate (object sender, EventArgs e)
{
Console.WriteLine("Button clicked!");
};
例
次の例は匿名メソッドの概念を示しています:
例
using System;
delegate void NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static void AddNum(int p)
{
num += p;
Console.WriteLine("Named Method: {0}", num);
}
public static void MultNum(int q)
{
num *= q;
Console.WriteLine("Named Method: {0}", num);
}
static void Main(string[] args)
{
// 匿名メソッドを使用してデリゲートインスタンスを作成
NumberChanger nc = delegate(int x)
{
Console.WriteLine("Anonymous Method: {0}", x);
};
// 匿名メソッドを使用してデリゲートを呼び出し
nc(10);
// 名前付きメソッドを使用してデリゲートをインスタンス化
nc = new NumberChanger(AddNum);
// 名前付きメソッドを使用してデリゲートを呼び出し
nc(5);
// 別の名前付きメソッドを使用してデリゲートをインスタンス化
nc = new NumberChanger(MultNum);
// 名前付きメソッドを使用してデリゲートを呼び出し
nc(2);
Console.ReadKey();
}
}
}
delegate void NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static void AddNum(int p)
{
num += p;
Console.WriteLine("Named Method: {0}", num);
}
public static void MultNum(int q)
{
num *= q;
Console.WriteLine("Named Method: {0}", num);
}
static void Main(string[] args)
{
// 匿名メソッドを使用してデリゲートインスタンスを作成
NumberChanger nc = delegate(int x)
{
Console.WriteLine("Anonymous Method: {0}", x);
};
// 匿名メソッドを使用してデリゲートを呼び出し
nc(10);
// 名前付きメソッドを使用してデリゲートをインスタンス化
nc = new NumberChanger(AddNum);
// 名前付きメソッドを使用してデリゲートを呼び出し
nc(5);
// 別の名前付きメソッドを使用してデリゲートをインスタンス化
nc = new NumberChanger(MultNum);
// 名前付きメソッドを使用してデリゲートを呼び出し
nc(2);
Console.ReadKey();
}
}
}
上記のコードをコンパイルして実行すると、次の結果が得られます:
Anonymous Method: 10 Named Method: 15 Named Method: 30
C# 2.0 以降では、匿名メソッドを記述するためのより簡潔な構文形式であるラムダ式が導入されました。
ラムダ式を使用する:
例
using System;
delegate void NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static void AddNum(int p)
{
num += p;
Console.WriteLine("Named Method: {0}", num);
}
public static void MultNum(int q)
{
num *= q;
Console.WriteLine("Named Method: {0}", num);
}
static void Main(string[] args)
{
// ラムダ式を使用してデリゲートインスタンスを作成
NumberChanger nc = x => Console.WriteLine($"Lambda Expression: {x}");
// ラムダ式を使用してデリゲートを呼び出し
nc(10);
// 名前付きメソッドを使用してデリゲートをインスタンス化
nc = new NumberChanger(AddNum);
// 名前付きメソッドを使用してデリゲートを呼び出し
nc(5);
// 別の名前付きメソッドを使用してデリゲートをインスタンス化
nc = new NumberChanger(MultNum);
// 名前付きメソッドを使用してデリゲートを呼び出し
nc(2);
Console.ReadKey();
}
}
}
delegate void NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static void AddNum(int p)
{
num += p;
Console.WriteLine("Named Method: {0}", num);
}
public static void MultNum(int q)
{
num *= q;
Console.WriteLine("Named Method: {0}", num);
}
static void Main(string[] args)
{
// ラムダ式を使用してデリゲートインスタンスを作成
NumberChanger nc = x => Console.WriteLine($"Lambda Expression: {x}");
// ラムダ式を使用してデリゲートを呼び出し
nc(10);
// 名前付きメソッドを使用してデリゲートをインスタンス化
nc = new NumberChanger(AddNum);
// 名前付きメソッドを使用してデリゲートを呼び出し
nc(5);
// 別の名前付きメソッドを使用してデリゲートをインスタンス化
nc = new NumberChanger(MultNum);
// 名前付きメソッドを使用してデリゲートを呼び出し
nc(2);
Console.ReadKey();
}
}
}