Delegaten mit benannten im Vergleich zu anonymen Methoden (C#-Programmierhandbuch)
Ein Delegat kann einer benannten Methode zugeordnet werden. Wenn Sie einen Delegaten mit einer benannten Methode instanziieren, wird die Methode als Parameter übergeben. Beispiel:
// Declare a delegate:
delegate void Del(int x);
// Define a named method:
void DoWork(int k) { /* ... */ }
// Instantiate the delegate using the method as a parameter:
Del d = obj.DoWork;
Dies wird als Verwendung einer benannten Methode bezeichnet. Mit einer benannten Methode erstellte Delegaten können entweder eine static-Methode oder eine Instanzmethode kapseln. Benannte Methoden sind die einzige Möglichkeit, in früheren Versionen von C# einen Delegaten zu instanziieren. In Situationen, in denen das Erstellen einer neuen Methode ein unerwünschter Aufwand wäre, ermöglicht es Ihnen C# jedoch, einen Delegaten zu instanziieren und sofort einen Codeblock anzugeben, den der Delegat bei Aufruf verarbeitet. Der Block kann entweder einen Lambda-Ausdruck oder eine anonyme Methoden enthalten. Weitere Informationen finden Sie unter Anonyme Funktionen (C#-Programmierhandbuch).
Hinweise
Die Methode, die Sie als Delegatparameter übergeben, muss über die gleiche Signatur verfügen wie die Delegatdeklaration.
Eine Delegatinstanz kapselt entweder eine statische oder eine Instanzenmethode.
Obwohl Delegaten einen out-Parameter verwenden können, ist dies für Multicast-Ereignisdelegaten nicht zu empfehlen, da nicht vorhersagbar ist, welcher Delegat aufgerufen wird.
Beispiel 1
Im Folgenden sehen Sie ein einfaches Beispiel für die Deklaration und Verwendung eines Delegaten. Beachten Sie, dass der Delegat Del und die zugeordnete Methode MultiplyNumbers die gleiche Signatur haben.
// Declare a delegate
delegate void Del(int i, double j);
class MathClass
{
static void Main()
{
MathClass m = new MathClass();
// Delegate instantiation using "MultiplyNumbers"
Del d = m.MultiplyNumbers;
// Invoke the delegate object.
System.Console.WriteLine("Invoking the delegate using 'MultiplyNumbers':");
for (int i = 1; i <= 5; i++)
{
d(i, 2);
}
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
// Declare the associated method.
void MultiplyNumbers(int m, double n)
{
System.Console.Write(m * n + " ");
}
}
/* Output:
Invoking the delegate using 'MultiplyNumbers':
2 4 6 8 10
*/
Beispiel 2
Im folgenden Beispiel gibt ein Delegat, der einer statischen und einer Instanzmethode zugeordnet wird, aus jeder dieser Methoden spezifische Informationen zurück.
// Declare a delegate
delegate void Del();
class SampleClass
{
public void InstanceMethod()
{
System.Console.WriteLine("A message from the instance method.");
}
static public void StaticMethod()
{
System.Console.WriteLine("A message from the static method.");
}
}
class TestSampleClass
{
static void Main()
{
SampleClass sc = new SampleClass();
// Map the delegate to the instance method:
Del d = sc.InstanceMethod;
d();
// Map to the static method:
d = SampleClass.StaticMethod;
d();
}
}
/* Output:
A message from the instance method.
A message from the static method.
*/
Siehe auch
Aufgaben
Gewusst wie: Kombinieren von Delegaten (Multicastdelegaten) (C#-Programmierhandbuch)
Referenz
Delegaten (C#-Programmierhandbuch)
Anonyme Methoden (C#-Programmierhandbuch)
Ereignisse (C#-Programmierhandbuch)