コンセプト:
デリゲート: メソッドの参照アドレスを格納するために使用される参照型変数です。C
# のデリゲートは、1 つ以上のメソッドへの参照を格納できるタイプ セーフ オブジェクトです。デリゲートは、他の型と同様にメソッドにパラメーターとして渡すことができ、コールバック関数やイベント ハンドラーなどのシナリオでも使用できます。
デリゲートの基本的な構文は次のとおりです。
delegate returnType DelegateName(parameterList);
このうち、returnType はデリゲートが参照するメソッドの戻り値の型、DelegateName はデリゲートの名前、parameterList はデリゲートが参照するメソッドのパラメータ リストです。
デリゲートを使用する手順は次のとおりです。
1. デリゲートの型を宣言します。必要に応じてデリゲートの型を定義し、戻り値の型とパラメーター リストを指定します。デリゲート型はクラスの内部または外部で宣言できます。
delegate int CalculationDelegate(int a, int b);
2. デリゲート オブジェクトの作成: デリゲート オブジェクトを作成するには、デリゲート型を使用します。コンストラクターまたは簡略化された構文を使用できます。
CalculationDelegate addDelegate = new CalculationDelegate(Add);
3. メソッドの定義: デリゲートの型に一致するメソッドを定義します。メソッドの戻り値の型とパラメーター リストは、デリゲートによって参照されるメソッドと一致する必要があります。
int Add(int a, int b)
{
return a + b;
}
4. デリゲートの呼び出し: デリゲート オブジェクトを呼び出して、デリゲートによって参照されるメソッドを実行します。
int result = addDelegate(5, 3);
デリゲートは、単一のメソッドまたは複数のメソッドを参照できます。デリゲートが複数のメソッドを参照する場合、それはマルチキャスト デリゲート (Multicast Delegate) と呼ばれます。+= 演算子を使用して複数のメソッドをデリゲートに追加でき、-= 演算子を使用してデリゲートからメソッドを削除できます。
マルチキャスト デリゲートの例を次に示します。
delegate void MessageDelegate(string message);
void PrintMessage(string message)
{
Console.WriteLine("Printing: " + message);
}
void LogMessage(string message)
{
Console.WriteLine("Logging: " + message);
}
MessageDelegate messageDelegate = PrintMessage;
messageDelegate += LogMessage;
messageDelegate("Hello"); // 调用所有引用的方法
通常のデリゲートに加えて、C# には、Action や Func などの特別なデリゲートの種類もいくつか用意されています。Action デリゲートは値を返さないメソッドを参照するために使用され、Func デリゲートは値を返すメソッドを参照するために使用されます。
たとえば、Action デリゲートは次のように宣言されます (戻り値はありません)。
delegate void Action();
Func デリゲートの宣言は次のとおりです (戻り値あり)。
delegate TResult Func<out TResult>();
delegate TResult Func<in T, out TResult>(T arg);
コールバック関数を作成する C# デリゲート
まず、コールバック関数のシグネチャを定義するデリゲート型を宣言します。
delegate void CallbackDelegate(string message);
次に、デリゲートをパラメーターとして受け取り、操作の完了後にコールバック関数を呼び出すメソッドを作成します。
void PerformOperation(int value, CallbackDelegate callback)
{
// 模拟某个操作
int result = value * 2;
if(callback!=null){
// 调用回调函数
callback("操作结果为:" + result);
}
}
次に、コールバック関数の特定の実装を作成します。
void MyCallbackFunction(string message)
{
Console.WriteLine("回调函数被调用:" + message);
}
最後に、メイン プログラムで PerformOperation メソッドを呼び出し、コールバック関数をパラメータとして渡します。
//把MyCallbackFunction方法的引用地址赋值给CallbackDelegate 委托类型的变量
CallbackDelegate callbackDelegate = new CallbackDelegate(MyCallbackFunction);
//执行操作方法,在方法里面调用委托
PerformOperation(5, callbackDelegate);
プログラムを実行すると、次の結果が出力されます。
回调函数被调用:操作结果为:10
この例では、文字列型パラメーターを受け入れ、戻り値を持たない CallbackDelegate デリゲート型を定義します。次に、整数値とコールバック関数をパラメータとして受け取り、操作の実行後にコールバック関数を呼び出す PerformOperation メソッドを作成しました。最後に、コールバック関数の特定のロジックを実装するための MyCallbackFunction メソッドを定義しました。メイン プログラムでは、callbackDelegate デリゲート オブジェクトを作成し、それをパラメータとして PerformOperation メソッドに渡し、コールバック関数を実装します。
この例では、デリゲートを使用してコールバック関数を実装する方法を示します。デリゲート オブジェクトをパラメータとしてメソッドに渡すことにより、メソッドの実行後に後続の処理のためにコールバック関数を呼び出すことができます。
デリゲートは、イベント処理、非同期プログラミング、LINQ、および C# のコールバック関数で広く使用されています。デリゲートを使用すると、コードの分離と拡張性を実現し、コードの可読性と保守性を向上させることができます。