Les événements sont le mécanisme de base pour la mise en ?uvre des modèles d'observateurs en C #. Il permet à un objet de notifier l'occurrence d'une action spécifique sans être étroitement couplé à d'autres objets. Les événements sont essentiellement un encapsulation des délégués, permettant aux classes d'exposer des méthodes d'abonnement sans donner de contr?le des appels. Par exemple, l'événement Click dans la classe de bouton est basé sur la délégation EventHandler. Lorsque le bouton est cliqué, la méthode onClick sera appelée pour déclencher l'événement. Les points clés comprennent: 1. Les événements ne peuvent être appelés que par la classe qui les déclare; 2. Les abonnés peuvent ajouter ou supprimer dynamiquement les gestionnaires lors de l'exécution. Lors de la définition d'événements personnalisés, vous pouvez créer une classe qui hérite EventArgs et le délégué correspondant, tels que la classe FileWatcher, la classe de passage des informations de fichier via l'événement FileChanged. Les meilleures pratiques d'utilisation des événements sont: 3. Lorsque les abonnés n'ont plus besoin de mettre à jour, ils doivent se désabonner pour éviter les fuites de mémoire; 4. Prioriser l'utilisation de EventHandler
Les événements en C # sont une partie essentielle du support de la langue pour le modèle d'observateur. Dans leur c?ur, ils fournissent un moyen à un objet de notifier d'autres objets lorsque quelque chose se produit - sans ces objets ayant besoin d'être serrés. Si vous avez déjà utilisé des boutons dans un cadre d'interface utilisateur comme WPF ou WinForms, vous avez déjà travaillé avec des événements.

Qu'est-ce qu'un événement exactement?
Un événement est essentiellement un emballage autour d'un délégué. Il permet à une classe d'exposer un moyen pour un autre code de s'abonner à certaines actions, sans exposer un contr?le total sur l'invocation. Vous pouvez y penser comme une liste d'abonnement: les parties intéressées peuvent s'inscrire elles-mêmes et se faire avertir lorsqu'une action spécifique se produit.

Par exemple:
bouton de classe publique { Click de l'événement de l'événement public; VID VOID VRUX ONCLICK () { Cliquez sur? .Invoke (this, EventArgs.Empty); } }
Ici, Click
sur un événement basé sur le délégué EventHandler
. Lorsque quelqu'un clique sur le bouton, OnClick
est appelé, ce qui à son tour augmente l'événement. Toute méthode qui correspond à la signature de EventHandler
peut s'abonner à cet événement.

Points clés:
- Les événements ne peuvent être invoqués que de la classe qui les déclare.
- Les abonnés peuvent ajouter (
=
) ou supprimer (-=
) leurs gestionnaires lors de l'exécution.
Comment définir les événements personnalisés
Bien que .NET fournit de nombreux délégués intégrés comme EventHandler
, vous avez parfois besoin de votre propre structure de données personnalisée pour passer l'événement. C'est là que la définition de votre propre délégué et de votre événement Args devient utile.
Disons que vous créez un observateur de fichiers et souhaitez informer les abonnés lorsqu'un fichier modifie:
Définissez une classe
EventArgs
personnalisée:classe publique FileChangedEventArgs: EventArgs { Public String FileName {get; ensemble; } public DateTime ChangeTime {get; ensemble; } }
Définissez un délégué correspondant:
Le délégué public void fileChangedEventHandler (expéditeur d'objet, filechangedEventArgs e);
Déclarez l'événement dans votre classe:
Filewatcher de classe publique { événement public FileChangedEventHandler FileChanged; VOID virtuel protégé OnFileChanged (nom de fichier de cha?ne) { FileChanged? .Invoke (ceci, nouveau FileChangedEventargs { Nom de fichier = nom de fichier, ChangeTime = DateTime.now }); } }
Cela vous donne la flexibilité de transporter de riches informations contextuelles lors de l'événement de l'événement.
Meilleures pratiques et pièges communs
Travailler avec des événements est simple, mais il y a des gotchas:
évitez les fuites de mémoire en désinscrivant : si un abonné ne se désinscrit pas, l'éditeur gardera une référence, empêchant potentiellement la collecte des ordures. N'oubliez pas d'utiliser
-=
lorsque l'abonné n'a plus besoin de mises à jour.Utilisez
EventHandler<t></t>
au lieu de créer de nouveaux délégués : à moins que vous n'ayez une très bonne raison, préférez utiliser le génériqueEventHandler<t></t>
plut?t que de définir votre propre délégué. Il réduit le passe-partout et améliore la cohérence.Assurez-vous de vérifier NULL avant d'invoquer : Dans les anciennes versions de C #, vous écrivez
if (Click != null) Click(...);
. En C # moderne, vous pouvez utiliser en toute sécurité l'opérateur de conditionnement nulle:Click?.Invoke(...)
. Cela évite NullReferenceExceptions s'il n'y a pas d'abonnés.Les méthodes virtuelles pour élever des événements aident à hériter : en créant des classes virtuelles virtuelles
OnClick
peuvent remplacer le comportement sans casser l'encapsulation.
De plus, ne confondez pas les événements avec les notifications asynchrones - ils ne sont pas intrinsèquement asynchrones. Si vous avez besoin d'un comportement asynchrone, enveloppez l'invocation dans une tache ou utilisez
async/await
.
C'est ainsi que les événements fonctionnent sous le capot et comment les utiliser efficacement. Ils sont un outil puissant une fois que vous comprenez la mécanique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

CustomAttributes sont des mécanismes utilisés dans C # pour attacher des métadonnées aux éléments de code. Sa fonction principale consiste à hériter de la classe System.Attribute et à lire la réflexion à l'exécution pour implémenter des fonctions telles que la journalisation, le contr?le de l'autorisation, etc. spécifiquement, il comprend: 1. CustomAttributes sont des informations déclaratives, qui existent sous forme de classes de fonctionnalités, et sont souvent utilisées pour marquer des classes, des méthodes, etc.; 2. Lors de la création, vous devez définir une classe héritée de l'attribut et utiliser AttributUsage pour spécifier la cible d'application; 3. Après l'application, vous pouvez obtenir des informations sur les fonctionnalités via la réflexion, telles que l'utilisation d'attribut.getCustomAttribute ();

Le c?ur de la conception d'objets immuables et de structures de données en C # est de s'assurer que l'état de l'objet n'est pas modifié après la création, améliorant ainsi la sécurité des threads et la réduction des bogues causés par les changements d'état. 1. Utilisez des champs en lecture et coopérez avec l'initialisation du constructeur pour vous assurer que les champs ne sont attribués que pendant la construction, comme indiqué dans la classe de personne; 2. Encapsulez le type de collection, utilisez des interfaces de collecte immuables telles que ReadOnlyCollection ou Immutablelist pour empêcher une modification externe des collections internes; 3. Utilisez l'enregistrement pour simplifier la définition du modèle immuable et générer des attributs en lecture seule et des constructeurs par défaut, adaptés à la modélisation des données; 4. Il est recommandé d'utiliser System.Collections.imm lors de la création d'opérations de collecte immuables.

Créez un middleware personnalisé dans ASP.Netcore, qui peut être implémenté en écrivant des classes et en s'inscrivant. 1. Créez une classe contenant la méthode invokeaSync, gérez httpContext et requestdelegateNext; 2. Inscrivez-vous avec Usemiddleware dans Program.cs. Le middleware convient aux opérations générales telles que la journalisation, la surveillance des performances, la gestion des exceptions, etc. Contrairement aux filtres MVC, il agit sur l'ensemble de l'application et ne s'appuie pas sur le contr?leur. L'utilisation rationnelle du middleware peut améliorer la flexibilité structurelle, mais devrait éviter d'affecter les performances.

La clé de la rédaction du code C # est la maintenabilité et la testabilité. Diviser raisonnablement les responsabilités, suivre le principe de responsabilité unique (SRP) et prendre respectivement l'accès aux données, la logique métier et le traitement des demandes par le référentiel, le service et le contr?leur pour améliorer la clarté structurelle et l'efficacité des tests. L'interface polyvalente et l'injection de dépendance (DI) facilitent la mise en ?uvre du remplacement, l'extension des fonctions et les tests de simulation. Les tests unitaires doivent isoler les dépendances externes et utiliser des outils simulés pour vérifier la logique pour assurer une exécution rapide et stable. Standardiser la dénomination et la division de petites fonctions pour améliorer la lisibilité et l'efficacité de maintenance. L'adhésion aux principes de la structure claire, des responsabilités claires et des tests peut améliorer considérablement l'efficacité du développement et la qualité du code.

Des contraintes génériques sont utilisées pour restreindre les paramètres de type pour assurer un comportement spécifique ou des relations d'héritage, tandis que la covariation permet la conversion du sous-type. Par exemple, où: ICOMPARABLE garantit que t est comparable; La covariation telle que IEnumerable permet à IEnumerable d'être convertie en IEnumerable, mais elle n'est lue et ne peut pas être modifiée. Les contraintes courantes incluent la classe, la structure, new (), la classe de base et l'interface, et plusieurs contraintes sont séparées par des virgules; La covariation nécessite le mot-clé OUT et ne s'applique qu'aux interfaces et délégués, ce qui est différent de l'onduleur (en mot-clé). Notez que la covariance ne prend pas en charge les classes, ne peut pas être convertie à volonté et que les contraintes affectent la flexibilité.

Les points suivants doivent être suivis lors de l'utilisation de LINQ: 1. La priorité est donnée à LINQ lors de l'utilisation des opérations de données déclaratives telles que le filtrage, la conversion ou l'agrégation des données pour éviter une utilisation forcée dans des scénarios avec des effets secondaires ou des scénarios critiques de performance; 2. Comprendre les caractéristiques de l'exécution retardée, les modifications de l'ensemble de source peuvent conduire à des résultats inattendus, et les retards ou l'exécution doivent être sélectionnés en fonction des exigences; 3. Faites attention aux frais généraux de performances et de mémoire, les appels de cha?ne peuvent générer des objets intermédiaires et les codes sensibles aux performances peuvent être remplacés par des boucles ou des portées; 4. Gardez la requête concise et facile à lire, et divisez la logique complexe en plusieurs étapes pour éviter une nidification excessive et un mélange de plusieurs opérations.

Les problèmes communs avec asynchronisation et attendre en C # incluent: 1. Utilisation incorrecte de .Result ou .Wait () provoque une impasse; 2. Ignorer ConfigureAwait (False) provoque des dépendances contextuelles; 3. L'abus d'AsyncVoid provoque un contr?le manquant; 4. L'attente en série affecte les performances de la concurrence. La bonne fa?on est: 1. La méthode asynchrone doit être asynchrone tout le chemin pour éviter le blocage de la synchronisation; 2. L'utilisation de ConfigureAwait (false) dans la bibliothèque de classe est utilisée pour s'écarter du contexte; 3. Utiliser uniquement AsyncVoid dans le traitement des événements; 4. Les taches simultanées doivent d'abord être démarrées, puis attendre pour améliorer l'efficacité. Comprendre le mécanisme et normaliser l'utilisation du code asynchrone qui évite d'écrire un blocage substantiel.

L'interface Fluent est une méthode de conception qui améliore la lisibilité du code et l'expressivité à travers les appels de cha?ne. Le noyau est que chaque méthode renvoie l'objet actuel, afin que plusieurs opérations puissent être appelées en continu, comme Varresult = NewstringBuilder (). APPEND ("Hello"). Ajouter (""). Lors de la mise en ?uvre, vous devez combiner la méthode d'extension et le modèle de conception qui le renvoie, tels que la définition de la classe CluentString et le renvoi dans sa méthode, et la création d'une instance initiale via la méthode d'extension. Les scénarios d'application courants incluent la création de configurateurs (tels que les règles de vérification), la vérification
