C# デリゲート
C# のデリゲートは、C または C++ の関数へのポインターに似ています。 Delegate は、メソッドへの参照を保持する参照型変数です。参照は実行時に変更できます。
Delegate は、特にイベントとコールバック メソッドを実装するために使用されます。すべてのデリゲート (Delegate) は System.Delegate クラスから派生します。
デリゲート(デリゲート)の宣言
デリゲート宣言は、デリゲートが参照できるメソッドを決定します。デリゲートは、同じラベルを持つメソッドを指すことができます。
たとえば、デリゲートがあるとします。
public delegate int MyDelegate (string s);
上記のデリゲートは、単一の string パラメータを受け取り、int 型の変数を返すメソッドを参照するために使用できます。
デリゲートを宣言するための構文は次のとおりです:
delegate <return type> <delegate-name> <parameter list>
デリゲートをインスタンス化する(Delegate)
デリゲート型を宣言したら、newキーワードを使用してデリゲートオブジェクトを作成する必要があり、これは特定のメソッドに関連付けられます。デリゲートを作成するとき、new ステートメントに渡されるパラメーターはメソッド呼び出しと同じように記述されますが、パラメーターはありません。例:
public delegate void printString(string s); ... printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile);
次の例は、デリゲートの宣言、インスタンス化、および使用を示しています。デリゲートは、整数パラメーターを受け取り、整数値を返すメソッドを参照するために使用できます。
using System; delegate int NumberChanger(int n); namespace DelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { // 创建委托实例 NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); // 使用委托对象调用方法 nc1(25); Console.WriteLine("Value of Num: {0}", getNum()); nc2(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
上記のコードをコンパイルして実行すると、次の結果が生成されます:
Value of Num: 35 Value of Num: 175
デリゲートのマルチキャスト
デリゲート オブジェクトは、「+」演算子を使用して結合できます。マージされたデリゲートは、マージされた 2 つのデリゲートを呼び出します。同じタイプのデリゲートのみをマージできます。 「-」演算子を使用すると、マージされたデリゲートからコンポーネント デリゲートを削除できます。
デリゲートのこの便利な機能を使用すると、デリゲートが呼び出されるときに呼び出されるメソッドの呼び出しリストを作成できます。これは委任された マルチキャスト と呼ばれ、マルチキャストとも呼ばれます。次のプログラムは、デリゲートのマルチキャストを示しています。
using System; delegate int NumberChanger(int n); namespace DelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { // 创建委托实例 NumberChanger nc; NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); nc = nc1; nc += nc2; // 调用多播 nc(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
上記のコードをコンパイルして実行すると、次の結果が生成されます。
Value of Num: 75
デリゲートの目的
次の例は、デリゲートの使用方法を示しています。デリゲート printString は、文字列を入力として受け取り、何も返さないメソッドを参照するために使用できます。
このデリゲートを使用して 2 つのメソッドを呼び出します。1 つ目は文字列をコンソールに出力し、2 つ目は文字列をファイルに出力します:
using System; using System.IO; namespace DelegateAppl { class PrintString { static FileStream fs; static StreamWriter sw; // 委托声明 public delegate void printString(string s); // 该方法打印到控制台 public static void WriteToScreen(string str) { Console.WriteLine("The String is: {0}", str); } // 该方法打印到文件 public static void WriteToFile(string s) { fs = new FileStream("c:\message.txt", FileMode.Append, FileAccess.Write); sw = new StreamWriter(fs); sw.WriteLine(s); sw.Flush(); sw.Close(); fs.Close(); } // 该方法把委托作为参数,并使用它调用方法 public static void sendString(printString ps) { ps("Hello World"); } static void Main(string[] args) { printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile); sendString(ps1); sendString(ps2); Console.ReadKey(); } } }
上記のコードがコンパイルされて実行されると、次の結果が生成されます:
The String is: Hello World