Maison >développement back-end >Tutoriel C#.Net >Compilation des connaissances de base en C# Connaissances de base (21) Délégation (2)
En regardant http://www.php.cn/ sur l'utilisation des délégués dans l'article précédent, nous avons vu que
public void Description(string programerName, DescriptionDelegate description) { description(programerName); }
Cette méthode transmet un type de délégué de description DescriptionDelegate, donc pour cela La méthode sera à nouveau modifiée pour la rendre plus pratique à utiliser et le code sera plus raisonnable. Encapsulez le délégué, puis proposez au programmeur des méthodes de description dans différents langages :
Encapsulation :
public class ProgramDescriptionDelegate2 { public delegate void DescriptionDelegate(string programerName); public DescriptionDelegate myDelegate; public void Description(string programerName) { myDelegate(programerName); } }
Classe proposée :
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"); } }
C'est plus raisonnable, car des méthodes telles que public void CsharpProgramer(string programerName) doit être défini par les utilisateurs à tout moment et peut être considéré comme changeant à tout moment. ProgramDescriptionDelegate2 est entièrement une classe publique et elle est uniquement responsable de l'exécution des méthodes liées au délégué.
Appel :
TestDescriptionDelegate2 t = new TestDescriptionDelegate2(); t.Test();
Sortie :
Regardez la classe ProgramDescriptionDelegate2, public DescriptionDelegate myDelegate doit être un champ, selon l'encapsulation orientée objet ; , les champs doivent être encapsulés en tant qu'attributs. Nous devons donc ici utiliser un événement de champ très utile pour l'encapsuler.
L'encapsulation est la suivante :
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");//一般这个执行是放在引起事件执行的地方 } }
Appel :
TestEvent te = new TestEvent(); te.Test();
Le résultat est le suivant :
Comme vous pouvez le voir, qu'est-ce qu'un événement ? En fait, l'essence est d'utiliser la délégation, mais l'utilisation d'un événement transforme cette délégation en un mécanisme appelé événement.
Regardez ensuite la description msdn des délégués et des événements :
Un événement est un objet qui envoie un message pour signaler l'occurrence d'une opération. L'opération peut être provoquée par une interaction de l'utilisateur (opération de la souris, du clavier, etc.), ou par d'autres déclencheurs logiques de programme. Un objet qui capture un événement et y répond est appelé récepteur d'événement.
Dans la communication événementielle, la classe de l'expéditeur de l'événement ne sait pas quel objet ou quelle méthode recevra l'événement qu'elle déclenche. Il suffit de l'existence d'un intermédiaire entre la source et le récepteur. Le .NET Framework définit un type spécial (Délégué) qui fournit la fonctionnalité d'un pointeur de fonction. Un délégué est une classe qui contient une référence à une méthode. Contrairement aux autres classes, une classe déléguée a une signature et ne peut référencer que les méthodes qui correspondent à sa signature. De cette manière, le délégué équivaut à un pointeur de fonction de type sécurisé ou à un rappel. Bien que les délégués aient de nombreuses autres utilisations, seule la fonctionnalité de gestion des événements des délégués sera abordée ici. Une déclaration de délégué suffit pour définir une classe de délégué. La déclaration fournit la signature du délégué et le Common Language Runtime assure l'implémentation. Par exemple :
public délégué void AlarmEventHandler(object sender, AlarmEventArgs e);
le mot-clé delegate informe le compilateur que AlarmEventHandler est un type délégué. Par convention, les délégués d'événement dans le .NET Framework ont deux paramètres : la source qui a déclenché l'événement et les données de l'événement. C'est l'expéditeur et e.
Ce qui précède est le contenu des connaissances de base en C#, des connaissances de base (21) et de la commission (2). Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !