C# - デリゲート
C# デリゲートは、C または C++ における関数へのポインターに似ています。 代理人 メソッドへの参照を保持する参照型変数です。参照は実行時に変更できます。
デリゲートは、特にイベントとコールバック メソッドの実装に使用されます。すべてのデリゲートは System.Delegate から暗黙的に派生します クラス。
デリゲートの宣言
デリゲート宣言は、デリゲートによって参照できるメソッドを決定します。デリゲートは、デリゲートと同じシグネチャを持つメソッドを参照できます。
たとえば、デリゲートを考えてみましょう −
public delegate int MyDelegate (string s);
前述のデリゲートを使用して、単一の string を持つ任意のメソッドを参照できます パラメータを取得し、int を返します タイプ変数。
デリゲート宣言の構文は −
delegate <return type> <delegate-name> <parameter list>
デリゲートのインスタンス化
デリゲート型が宣言されたら、 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) { //create delegate instances NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); //calling the methods using the delegate objects 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) { //create delegate instances NumberChanger nc; NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); nc = nc1; nc += nc2; //calling multicast 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; // delegate declaration public delegate void printString(string s); // this method prints to the console public static void WriteToScreen(string str) { Console.WriteLine("The String is: {0}", str); } //this method prints to a file 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(); } // this method takes the delegate as parameter and uses it to // call the methods as required 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
C言語