C # - Delegierte
C # -Delegierte ähneln Zeigern auf Funktionen in C oder C ++. EINdelegateist eine Referenztypvariable, die den Verweis auf eine Methode enthält. Die Referenz kann zur Laufzeit geändert werden.
Delegaten werden insbesondere zum Implementieren von Ereignissen und Rückrufmethoden verwendet. Alle Delegierten werden implizit von der abgeleitetSystem.Delegate Klasse.
Delegierte erklären
Die Delegatendeklaration bestimmt die Methoden, auf die der Delegat verweisen kann. Ein Delegat kann auf eine Methode verweisen, die dieselbe Signatur wie die des Delegaten hat.
Stellen Sie sich zum Beispiel einen Delegierten vor -
public delegate int MyDelegate (string s);
Der vorhergehende Delegat kann verwendet werden, um auf jede Methode zu verweisen, die einen einzelnen Zeichenfolgenparameter hat und eine Variable vom Typ int zurückgibt .
Die Syntax für die Delegatendeklaration lautet -
delegate <return type> <delegate-name> <parameter list>
Delegierte instanziieren
Sobald ein Delegatentyp deklariert ist, muss mit dem ein Delegatobjekt erstellt werden new Schlüsselwort und mit einer bestimmten Methode zugeordnet werden. Beim Erstellen eines Delegaten wurde das Argument an das übergebennewAusdruck wird ähnlich wie ein Methodenaufruf geschrieben, jedoch ohne die Argumente für die Methode. Zum Beispiel -
public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
Das folgende Beispiel zeigt die Deklaration, Instanziierung und Verwendung eines Delegaten, mit dem auf Methoden verwiesen werden kann, die einen Ganzzahlparameter verwenden und einen Ganzzahlwert zurückgeben.
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();
}
}
}
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
Value of Num: 35
Value of Num: 175
Multicasting eines Delegierten
Delegierte Objekte können mit dem Operator "+" erstellt werden. Ein zusammengesetzter Delegierter ruft die beiden Delegierten an, aus denen er zusammengesetzt war. Es können nur Delegierte desselben Typs zusammengestellt werden. Mit dem Operator "-" kann ein Komponentendelegierter aus einem zusammengesetzten Delegaten entfernt werden.
Mit dieser Eigenschaft von Delegaten können Sie eine Aufrufliste mit Methoden erstellen, die beim Aufrufen eines Delegaten aufgerufen werden. Das nennt manmulticastingeines Delegierten. Das folgende Programm demonstriert das Multicasting eines Delegaten:
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();
}
}
}
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
Value of Num: 75
Delegaten verwenden
Das folgende Beispiel zeigt die Verwendung von Delegaten. Der Delegat printString kann verwendet werden, um auf eine Methode zu verweisen, die eine Zeichenfolge als Eingabe verwendet und nichts zurückgibt.
Wir verwenden diesen Delegaten, um zwei Methoden aufzurufen: Die erste druckt die Zeichenfolge auf der Konsole und die zweite druckt sie in eine Datei -
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();
}
}
}
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
The String is: Hello World