Beauftragter Konzeptautor: Liang Binyu. Ein Auszug aus „C# Beginner Classroom“ wird bald veröffentlicht
[email protected]
http://www.cnblogs.com/BeginnerClassroom
Manchmal müssen wir eine Funktion als Parameter einer anderen Funktion verwenden, dann müssen wir den Delegatenmechanismus verwenden. Delegation ist ein schwer klar zu erklärendes Konzept. Der Autor dachte mehrere Tage lang intensiv nach und kam schließlich auf ein geniales Beispiel.
Als nächstes entwerfen wir eine Zirkusaufführungsfunktion RunCircus(). Ihr erster Parameter ist eine Funktion, die ein Tier darstellt, die Leistung dieses Tieres wird ausgeführt. Bitte erstellen Sie ein neues Projekt mit dem Namen „Delegate“ und fügen Sie den folgenden Code hinzu.
Probieren Sie es aus: Delegierte definieren
//"C#-Anfänger-Klassenzimmer"
//Funktion: Hundeausstellung
static void DogAct(string name)
{
Console.WriteLine("Hallo, ich bin " + Name + "!");
Console.WriteLine(@"
.----.
_.'__ `.
.--(#)(##)---/#
.' @ /###
: , #####
`-..__.-' _.-###/
`;_: `''
.''''''''''.
/,Snoopy,
// COOL! \
„-._______.-“
___`.
(______|______)");
}
//Funktion: Katzenausstellung
static void CatAct(string name)
{
Console.WriteLine("Hallo, ich bin " + Name + "!");
Console.WriteLine(@"
.-. __ _ .-.
|. ` / |
/ '.()--
|. '._/
_|. O _ O |_
= '-' /=
'-._____.-'
/`/___/`
//o o/
(_| |_)
|____,____|
(____|____)");
}
//Funktion: Löwenshow
static void LionAct(string name)
{
Console.WriteLine("Hallo, ich bin " + Name + "!");
Console.WriteLine(@"
,%%%%%%%%,
,%%/%%%%/%%
,%%%c "" J/%%%
% %%%/ o o %%%.
`%%. %%%% _ |%%%
`%% `%%%%(__Y__)%%'
// ;%%%%`-/%%%'
(( / `%%%%%%%'
\ .' |
\ / |
\/ ) |
/_ |. |__
(____________))))))))");
}
//Delegierten definieren
Delegate void AnimalAct(string name);
//Funktion: Zirkusvorstellung (der erste Parameter ist der Delegate vom Typ AnimalAct)
static void RunCircus(AnimalAct animalAct, Stringname)
{
animalAct(name);
}
static void Main(string[] args)
{
//Konvertieren Sie die Funktion DogAct() in einen Delegaten vom Typ AnimalAct
AnimalAct deleDogAct = new AnimalAct(DogAct);
//Übergeben Sie den Delegaten deleDogAct an die Funktion RunCircus()
RunCircus(deleDogAct, „Snoopy“);
//Konvertieren Sie die Funktion CatAct() in einen Delegaten vom Typ AnimalAct und übergeben Sie ihn an die Funktion RunCircus()
RunCircus(new AnimalAct(CatAct), „ Kitty “);
}
Die Laufergebnisse sind wie folgt:
„C#-Anfängerkurs“
Der erste Parameter der Funktion RunCircus(AnimalAct animalAct, string name) ist eigentlich eine Funktion, die ein Tier darstellt. Welche Art von Funktion wird an sie übergeben, welche Art von Tier wird verwendet? Um jedoch eine strenge Typprüfung durchzuführen, können wir den Namen der Funktion nicht direkt an sie übergeben, sondern müssen zunächst einen Delegaten (Dlelegate) definieren, dh einen „Funktionstyp“ definieren.
Der Delegat wird mit dem Schlüsselwort Delegate deklariert. Die obige Anweisung definiert einen Delegaten (Funktionstyp) namens AnimalAct, der den Parametertyp und den Rückgabewerttyp des Delegaten eindeutig angibt. Wenn wir eine Funktion als Parameter verwenden müssen, müssen wir sie zunächst in eine Delegate-Instanz konvertieren.
Diese Delegateninstanz wird dann als Parameter an die Funktion übergeben, die sie aufruft.
Es ist ersichtlich, dass die Delegate-Instanz deleDogAct tatsächlich ein Alias der Funktion DogAct() ist. Offensichtlich sollten der Delegat und die delegierte Funktion denselben Parametertyp und Rückgabetyp haben.
In unserem Programm ruft der Zirkus zur Ausführung immer die Funktion RunCircus() auf. Bei der Definition der Funktion RunCircus() wissen wir nicht, welche Funktion der an sie übergebene Delegat darstellt. Diese Funktion wird erst dann materialisiert, wenn die Funktion RunCircus() aufgerufen und die tatsächlichen Parameter an sie übergeben werden. Welche tatsächlichen Parameter auch immer an ihn übergeben werden, die Aufführung wird durchgeführt, wenn Sie ihm die deleDogAct-Delegation übergeben. Wenn Sie ihm eine deleCatAct-Delegation übergeben, führt der Zirkus eine Katzenvorstellung auf Als deleLionAct-Delegation wird der Zirkus eine Katzenvorstellung aufführen. Daher haben Funktionen, die Delegaten als Parameter verwenden, eine gewisse Allgemeingültigkeit.