Delegierte und Ereignisse werden in C# häufig verwendet, insbesondere bei der Formularprogrammierung. Viele Vorgänge müssen über Delegaten und Ereignisse verarbeitet und bereitgestellt werden. Hier finden Sie eine detaillierte Erläuterung der Verwendung und der Gründe von Delegaten und Ereignissen, damit wir sie beim Schreiben von Code besser verstehen können.
Die Verwendung von Delegation
Ereignisse sind ein Mechanismus, und Ereignisse werden durch Delegation implementiert. Wenn Sie also Delegation verstehen, werden Sie Ereignisse besser verstehen. Schauen wir uns unten ein kleines Beispiel an.
Dies ist der Code zur Beschreibung von Programmierern in verschiedenen Sprachen:
Zum Beispiel beschreiben wir einen Programmierer, der C# verwendet, wie folgt, wobei der Parameter „programerName“ den Namen des Programmierers darstellt.
public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用C#编程!", programerName)); }
Verwenden Sie Java,
public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用Java语言编程!")); }
Wie können Sie bei so vielen Sprachen feststellen, um welchen Programmierer es sich handelt? Verwenden Sie eine Aufzählung zur Darstellung:
public enum ProgramLanguage { CSharp, C, Java }
Geben Sie dann eine vollständige Beschreibung ein. Der Code lautet wie folgt:
public class ProgramerDescription { //01 public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用C#编程!", programerName)); } public void CProgramer(string programerName) { Console.WriteLine(string.Format("{0}使用C语言编程!", programerName)); } public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用Java语言编程!")); } //02 public void Description(string programerName, ProgramLanguage type) { switch (type) { case ProgramLanguage.CSharp: CsharpProgramer(programerName); break; case ProgramLanguage.C: CProgramer(programerName); break; case ProgramLanguage.Java: JavaProgramer(programerName); break; default: Console.WriteLine("A kind of new Language that you never heard of."); break; } } } public enum ProgramLanguage { CSharp, C, Java }
Aufruf:
ProgramerDescription pm = new ProgramerDescription(); pm.Description("杨友山", ProgramLanguage.CSharp);
Zu diesem Zeitpunkt , Ausgabe „Yang Youshan verwendet C# zum Programmieren!“;
Auf diese Weise wurde zunächst eine einfache Implementierung der Beschreibung des Programmierers abgeschlossen. Die Beschreibungsmethode verwendet hier einen Aufzählungstyp, um verschiedene Sprachen zu unterscheiden. Daher ist die Wartbarkeit relativ schlecht, da es viele Programmiersprachen (C++, PHP usw.) gibt. Wenn Sie eine Sprache hinzufügen möchten, müssen Sie eine entsprechende Methode hinzufügen und diese dann ändern ProgramLanguage-Aufzählungstyp. Das Hinzufügen von Methoden hat kaum Auswirkungen auf das ursprüngliche Programm, da es mithilfe von Teilklassen implementiert werden kann. Eine Änderung der Aufzählung ist jedoch nicht im Einklang mit dem offenen und geschlossenen Prinzip des objektorientierten Designs.
Wie geht man damit in der Beschreibungsmethode um, also ohne Aufzählung? Wie unterscheidet die Beschreibungsmethode, welche Methode (CsharpProgramer, CProgramer, JavaProgramer) aufgerufen werden soll, um den Programmierer zu beschreiben?
public void Description(string programerName, ein bestimmter Parameter eines bestimmten Typs)
{
// Rufen Sie die entsprechende Methode auf
}
Der bestimmte Typ wird hier verwendet, um den Typ davon zu unterscheiden Mit anderen Worten, es ist am besten, wenn ich die Methode, die ich aufrufen möchte, hier direkt als Parameter übergebe. Zum Beispiel möchte ich die CProgramer-Methode aufrufen, um einen C-Programmierer zu beschreiben,
ProgramerDescription pm = new ProgramerDescription(); So drücken Sie „einen bestimmten Typ und einen bestimmten Parameter“ von Description(string programerName, einen bestimmten Typ und a aus bestimmter Parameter)?
Aufruf:
public class ProgramDescriptionDelegate { //委托,表示方法 public delegate void DescriptionDelegate(string programerName); //01 public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用C#编程!", programerName)); } public void CProgramer(string programerName) { Console.WriteLine(string.Format("{0}使用C语言编程!", programerName)); } public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用Java语言编程!")); } //02 public void Description(string programerName, DescriptionDelegate description) { description(programerName); } }
Das Ergebnis ist das gleiche wie der ursprüngliche Code.
Was ist Delegation? MSDN erklärt es so: Ein Delegat ist ein Typ, der eine Methodensignatur definiert, mit jeder Methode mit einer kompatiblen Signatur verknüpft werden kann und über den Delegaten aufgerufen werden kann. Delegaten werden verwendet, um Methoden als Parameter an andere Methoden zu übergeben. Zeithandler sind Methoden, die über Delegaten aufgerufen werden.ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); pm.Description("杨友山", pm.CsharpProgramer);
Sehen Sie sich den Code mit dem Delegaten genau an,
public void Description(string programerName, DescriptionDelegate description). Beim Aufruf wird die
Ergebnis:
//方法和委托绑定 ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate csharpDelegate = pm.CsharpProgramer; YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate cdelegate = pm.CProgramer; pm.Description("杨友山", csharpDelegate); pm.Description("D.M.Ritchie", cdelegate);
Erneut ändern:
Ergebnis :
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate pdelegate = null; pdelegate += pm.CsharpProgramer; pdelegate += pm.CProgramer; pm.Description("杨友山", pdelegate);
Hier wird zuerst pm.CsharpProgramer und dann die Methode pm.CProgramer ausgeführt. Es ist ersichtlich, dass der Delegat nicht nur Methoden als Parameter verwenden, sondern auch Methoden binden und mehrere Methoden binden kann.
Verwenden Sie += zum Binden der Methode und -= zum Abbrechen. Der obige Aufruf kann wie folgt geändert werden:
Auf diese Weise wird nur eine Methode pm.CsharpProgramer aufgerufen.
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate pdelegate = null; pdelegate += pm.CsharpProgramer; pdelegate += pm.CProgramer; pdelegate -= pm.CProgramer; pm.Description("杨友山", pdelegate);