Heim > Artikel > Backend-Entwicklung > Zusammenstellung von C#-Grundkenntnissen Grundkenntnisse (21) Delegation (2)
Wenn wir uns http://www.php.cn/ über die Verwendung von Delegaten im vorherigen Artikel ansehen, sehen wir, dass
public void Description(string programerName, DescriptionDelegate description) { description(programerName); }
Diese Methode einen Beschreibungsdelegatentyp „DescriptionDelegate“ übergibt Die Methode wird erneut geändert, um die Verwendung komfortabler zu gestalten und den Code sinnvoller zu gestalten. Kapseln Sie den Delegaten und schlagen Sie dann dem Programmierer Beschreibungsmethoden in verschiedenen Sprachen vor:
Kapselung:
public class ProgramDescriptionDelegate2 { public delegate void DescriptionDelegate(string programerName); public DescriptionDelegate myDelegate; public void Description(string programerName) { myDelegate(programerName); } }
Vorgeschlagene Klasse:
public class TestDescriptionDelegate2 { 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语言编程!", programerName)); } public void Test() { ProgramDescriptionDelegate2 pe = new ProgramDescriptionDelegate2(); pe.myDelegate = CsharpProgramer; pe.myDelegate += CProgramer; pe.Description("SamYang"); } }
Dies ist sinnvoller, weil Methoden wie public void CsharpProgramer(string programerName) sollte jederzeit von Benutzern definiert werden und kann jederzeit als sich ändernd angesehen werden. ProgramDescriptionDelegate2 ist eine vollständig öffentliche Klasse und nur für die Ausführung von an den Delegaten gebundenen Methoden verantwortlich.
Aufruf:
TestDescriptionDelegate2 t = new TestDescriptionDelegate2(); t.Test();
Ausgabe:
Schauen Sie sich die Klasse ProgramDescription2 an, public DescriptionDelegate myDelegate sollte gemäß der objektorientierten Kapselung ein Feld sein , Felder sollten als Attribute gekapselt werden. Hier müssen wir also ein sehr nützliches Feldereignis verwenden, um es zu kapseln.
Die Kapselung ist wie folgt:
public class ProgramerDescriptionEvent { public delegate void DescriptionDelegate(string programerName); private event DescriptionDelegate myEvent; public event DescriptionDelegate MyEvent { add { this.myEvent += value; } remove { this.myEvent -= value; } } public void Description(string programerName) { myEvent(programerName); } }
public class TestEvent { 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语言编程!", programerName)); } public void Test() { ProgramerDescriptionEvent pe = new ProgramerDescriptionEvent(); pe.MyEvent += CsharpProgramer; pe.MyEvent += JavaProgramer; pe.Description("SamYang");//一般这个执行是放在引起事件执行的地方 } }
Aufruf:
TestEvent te = new TestEvent(); te.Test();
Das Ergebnis ist wie folgt:
Wie Sie sehen können, besteht das Wesentliche darin, eine Delegation zu verwenden, aber die Verwendung eines Ereignisses verwandelt diese Delegation in einen Mechanismus, der als Ereignis bezeichnet wird.
Sehen Sie sich dann die Beschreibung der Delegaten und Ereignisse von msdn an:
Ein Ereignis ist ein Objekt, das eine Nachricht sendet, um das Auftreten einer Operation zu signalisieren. Die Operation kann durch Benutzerinteraktion (Maus-, Tastaturbedienung usw.) verursacht werden. oder durch einige andere Programmlogik-Trigger. Ein Objekt, das ein Ereignis erfasst und darauf reagiert, wird als Ereignisempfänger bezeichnet.
Bei der Ereigniskommunikation weiß die Ereignissenderklasse nicht, welches Objekt oder welche Methode das von ihr ausgelöste Ereignis empfängt. Erforderlich ist lediglich die Existenz eines Vermittlers zwischen der Quelle und dem Empfänger. Das .NET Framework definiert einen speziellen Typ (Delegate), der die Funktionalität eines Funktionszeigers bereitstellt. Ein Delegat ist eine Klasse, die einen Verweis auf eine Methode enthält. Im Gegensatz zu anderen Klassen verfügt eine Delegate-Klasse über eine Signatur und kann nur auf Methoden verweisen, die mit ihrer Signatur übereinstimmen. Auf diese Weise entspricht der Delegat einem typsicheren Funktionszeiger oder einem Rückruf. Obwohl Delegaten viele andere Verwendungszwecke haben, wird hier nur die Ereignisverarbeitungsfunktionalität von Delegaten besprochen. Eine Delegate-Deklaration reicht aus, um eine Delegate-Klasse zu definieren. Die Deklaration stellt die Signatur des Delegaten bereit und die Common Language Runtime stellt die Implementierung bereit. Beispiel:
public Delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
delegate-Schlüsselwort informiert den Compiler darüber, dass AlarmEventHandler ein Delegate-Typ ist. Konventionell verfügen Ereignisdelegaten im .NET Framework über zwei Parameter: die Quelle, die das Ereignis ausgelöst hat, und die Daten für das Ereignis. Das ist Absender und E.
Das Obige ist der Inhalt der Grundkenntnisse von C#, Grundkenntnisse (21) und Provision (2). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!