Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
1h 9m 13s
Les événements en C# sont un concept fondamental que de nombreux développeurs utilisent mais qu'ils ne comprennent pas toujours parfaitement, en particulier lorsqu'il s'agit de créer leurs propres événements. Tim Corey fournit un guide complet sur la création et l'utilisation d'événements, explorant les meilleures pratiques et les fonctionnalités avancées dans sa vidéo "Événements C# - Création et consommation d'événements dans votre application".
Dans cet article, nous allons explorer les événements C#, en nous concentrant sur leur syntaxe, leur définition et la manière dont ils permettent de résoudre des problèmes de programmation courants, à l'aide des exemples vidéo de Tim Corey. Comprendre la gestion des événements en C# est essentiel pour créer des applications réactives, et cet article vous aidera à saisir les concepts fondamentaux de la journalisation des erreurs personnalisées, de la gestion des exceptions et de la programmation axée sur les événements.
En C# et dans les langages de programmation, les événements jouent un rôle essentiel dans la programmation pilotée par les événements, permettant aux applications de répondre à des actions telles que les interactions de l'utilisateur ou les changements du système. Par rapport à d'autres langages de programmation, C# offre une approche structurée de la gestion des événements, ce qui le rend idéal pour les applications rapides et de petite taille. Les événements en C# sont déclenchés par des actions spécifiques, et ces actions invoquent les gestionnaires d'événements correspondants pour effectuer les tâches souhaitées.
Tim commence par expliquer que la plupart des développeurs connaissent les événements en C#, mais ne savent pas forcément comment créer des événements personnalisés. L'objectif de la vidéo est de présenter les événements, d'expliquer la création d'événements personnalisés, de discuter de leurs caractéristiques et d'exposer les meilleures pratiques.
Tim utilise une simple application bancaire construite avec Windows Forms (WinForms) pour démontrer les événements. L'application simule les opérations bancaires de base d'un client, notamment la consultation des soldes et l'enregistrement des transactions.
Vue d'ensemble de l'application :
Formulaire principal :
Formulaire de transaction :
Tim explique le code backend de l'application bancaire de démonstration :
Clientèle :
Classe de compte :
Gestion des dépôts et des paiements :
Protection contre les découverts :
Pour les exemples de code, vous pouvez vous référer directement à la vidéo de Tim Corey où il explique le code de 3:18 à 18:27.
Dans cette section, Tim Corey s'est plongé dans le fonctionnement des événements de clic de bouton dans Windows Forms, expliquant comment ces événements sont câblés et comment ils fonctionnent.
Tim commence par expliquer le concept familier des événements de clics de boutons dans les applications Windows Forms. Lorsque vous double-cliquez sur un bouton dans le concepteur, Visual Studio génère automatiquement une méthode de gestion d'événement pour l'événement de clic.
Méthode du gestionnaire d'événements :
private void recordTransactionButton_Click(object sender, EventArgs e)
{
// Code to handle the button click event
}
Câblage de l'événement :
this.recordTransactionButton.Click += new System.EventHandler(this.recordTransactionButton_Click);AddHandler Me.recordTransactionButton.Click, AddressOf Me.recordTransactionButton_ClickTim explique comment créer des événements personnalisés en C#, en commençant par la classe Compte où les événements seront déclenchés.
Définir un événement :
public event EventHandler<string> RaiseTransactionApprovedEvent;Public Event RaiseTransactionApprovedEvent As EventHandler(Of String)Déclencher l'événement :
this) et les données d'événement (dans ce cas, une chaîne).private void OnTransactionApproved(string transactionName)
{
RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
}
Câblage et gestion des événements :
account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
private void Account_RaiseTransactionApprovedEvent(object sender, string e)
{
// Code to handle the event
}
Tim explique comment utiliser les événements pour mettre automatiquement à jour l'interface utilisateur du navigateur lorsque certaines actions se produisent, par exemple lorsqu'une transaction est approuvée.
Événements de sensibilisation :
public void AddDeposit(decimal amount, string depositName)
{
// Code to add deposit
RaiseTransactionApprovedEvent?.Invoke(this, depositName);
}
Souscription aux événements dans l'interface utilisateur :
public MainForm()
{
InitializeComponent();
account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
}
private void Account_RaiseTransactionApprovedEvent(object sender, string e)
{
// Update the UI with the new transaction
}
Tim Corey explique l'utilisation de la syntaxe ?.Invoke() lors de la levée d'événements en C#. Cette approche moderne simplifie le code et garantit la sécurité des threads.
Le point d'interrogation ( ?.) devant Invoke est un opérateur conditionnel nul. Il vérifie si le gestionnaire d'événements est nul avant de l'invoquer, ce qui permet d'éviter les exceptions potentielles.
Approche traditionnelle :
if (RaiseTransactionApprovedEvent != null)
{
RaiseTransactionApprovedEvent(this, depositName);
}
Approche moderne avec ?.Invoke() :
RaiseTransactionApprovedEvent?.Invoke(this, depositName);RaiseTransactionApprovedEvent?.Invoke(Me, depositName)RaiseTransactionApprovedEvent est null, l'invocation ne se poursuit pas, évitant ainsi effectivement toute exception.Avantages :
Tim explique comment écouter les événements personnalisés dans une application Windows Forms et mettre à jour l'interface utilisateur en conséquence.
S'inscrire à des événements :
customer.CheckingAccount.TransactionApprovedEvent += CheckingAccount_TransactionApprovedEvent;AddHandler customer.CheckingAccount.TransactionApprovedEvent, AddressOf CheckingAccount_TransactionApprovedEventMéthode du gestionnaire d'événements :
private void CheckingAccount_TransactionApprovedEvent(object sender, string e)
{
// Update the UI with the new transaction
checkingTransactionsDataSource.DataSource = null;
checkingTransactionsDataSource.DataSource = customer.CheckingAccount.Transactions;
checkingBalanceLabel.Text = customer.CheckingAccount.Balance.ToString("C2");
}
Tim montre l'ensemble du processus de création, d'augmentation et de gestion des événements personnalisés en action.
Déclencher l'événement :
private void OnTransactionApproved(string transactionName)
{
RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
}
Gestion d'événements multiples :
public MainForm()
{
InitializeComponent();
customer.CheckingAccount.TransactionApprovedEvent += CheckingAccount_TransactionApprovedEvent;
customer.SavingsAccount.TransactionApprovedEvent += SavingsAccount_TransactionApprovedEvent;
}
private void SavingsAccount_TransactionApprovedEvent(object sender, string e)
{
// Update the UI with the new savings transaction
savingsTransactionsDataSource.DataSource = null;
savingsTransactionsDataSource.DataSource = customer.SavingsAccount.Transactions;
savingsBalanceLabel.Text = customer.SavingsAccount.Balance.ToString("C2");
}
Exécuter l'application :
Tim montre comment déboguer les événements et inspecter les informations qu'ils envoient.
Établir un point d'arrêt :
private void CheckingAccount_TransactionApprovedEvent(object sender, string e)
{
// Breakpoint here
}
Débogage :
Tim Corey développe la démo en créant un autre événement personnalisé pour gérer les situations de découvert. Cet événement sera déclenché lorsqu'un découvert se produit et notifiera à l'utilisateur le montant du découvert.
Tim commence par définir un nouvel événement dans la classe Compte pour les scénarios de découvert :
Déclaration d'événement :
public event EventHandler<decimal> OverdraftEvent;Public Event OverdraftEvent As EventHandler(Of Decimal)Déclencher l'événement :
if (overdraftSuccessful)
{
OverdraftEvent?.Invoke(this, overdraftAmount);
}
Câblage de l'événement :
customer.CheckingAccount.OverdraftEvent += CheckingAccount_OverdraftEvent;AddHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEventGérer l'événement :
private void CheckingAccount_OverdraftEvent(object sender, decimal e)
{
errorMessage.Text = $"You had an overdraft protection transfer of {e:C2}";
errorMessage.Visible = true;
}
Déclenchement et affichage de l'événement :
You had an overdraft protection transfer of $20.44
Tim explique comment écouter le même événement dans plusieurs langues et sous plusieurs formes, démontrant ainsi la polyvalence des événements.
Ajouter une étiquette à un autre formulaire :
<asp:Label ID="errorMessage" runat="server" Visible="false" />
S'inscrire à l'événement :
customer.CheckingAccount.OverdraftEvent += SecondaryForm_OverdraftEvent;AddHandler customer.CheckingAccount.OverdraftEvent, AddressOf SecondaryForm_OverdraftEventGérer l'événement :
private void SecondaryForm_OverdraftEvent(object sender, decimal e)
{
errorMessage.Visible = true;
}
Gestion simultanée d'événements :
Both the main form and the secondary form display the overdraft message when the event is triggered.
Tim souligne l'importance de nettoyer les récepteurs d'événements afin d'éviter les fuites de mémoire et de garantir la bonne performance de l'application.
Désabonnement aux événements :
customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;RemoveHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEventPourquoi c'est important :
Utilisation de méthodes nommées :
// Good practice: using named methods for event handlers' Good practice: using named methods for event handlersTim Corey explique les meilleures pratiques pour transmettre des données par le biais d'événements, en particulier les avantages de l'utilisation d'une classe plutôt que de types de données simples comme les chaînes de caractères ou les décimales.
Tim commence par expliquer pourquoi l'utilisation de types de données simples pour les événements est moins courante et pourquoi il est généralement préférable de passer une classe :
Flexibilité et évolutivité :
EventArgs Inheritance :
Tim montre comment créer une classe EventArgs personnalisée pour l'événement de découvert.
Définir la classe :
public class OverdraftEventArgs : EventArgs
{
public decimal AmountOverdrafted { get; private set; }
public string MoreInfo { get; private set; }
public OverdraftEventArgs(decimal amountOverdrafted, string moreInfo)
{
AmountOverdrafted = amountOverdrafted;
MoreInfo = moreInfo;
}
}
Utilisation de la classe dans l'événement :
public event EventHandler<OverdraftEventArgs> OverdraftEvent;Public Event OverdraftEvent As EventHandler(Of OverdraftEventArgs)Déclencher l'événement :
OverdraftEvent?.Invoke(this, new OverdraftEventArgs(amountNeeded, "Additional info"));OverdraftEvent?.Invoke(Me, New OverdraftEventArgs(amountNeeded, "Additional info"))Tim souligne l'importance d'utiliser des propriétés en lecture seule dans la classe EventArgs afin d'éviter toute modification accidentelle des données de l'événement.
Éviter les modifications :
Exemple du problème :
private void CheckingAccount_OverdraftEvent(object sender, OverdraftEventArgs e)
{
e.AmountOverdrafted = 1000; // This modification affects all handlers
}
Solution :
public decimal AmountOverdrafted { get; private set; }
public string MoreInfo { get; private set; }
Tim Corey met en évidence une exception importante à la règle de l'utilisation de paramètres privés pour les propriétés de données d'événements. Cette exception se produit lorsque vous devez permettre aux auditeurs d'événements de modifier les données de l'événement, par exemple lorsqu'une transaction peut être annulée en fonction de certaines conditions.
Tim donne un exemple dans lequel un gestionnaire d'événements peut avoir besoin d'annuler une transaction. Pour ce faire, une propriété CancelTransaction est ajoutée à la classe EventArgs personnalisée.
Définir la propriété :
public class OverdraftEventArgs : EventArgs
{
public decimal AmountOverdrafted { get; private set; }
public string MoreInfo { get; private set; }
public bool CancelTransaction { get; set; } = false;
public OverdraftEventArgs(decimal amountOverdrafted, string moreInfo)
{
AmountOverdrafted = amountOverdrafted;
MoreInfo = moreInfo;
}
}
Configuration de la propriété dans le gestionnaire d'événements :
private void CheckingAccount_OverdraftEvent(object sender, OverdraftEventArgs e)
{
if (denyOverdraft.Checked)
{
e.CancelTransaction = true;
}
errorMessage.Text = $"You had an overdraft protection transfer of {e.AmountOverdrafted:C2}";
errorMessage.Visible = true;
}
Vérification de la propriété dans la méthode source :
if (args.CancelTransaction)
{
return false; // Transaction is canceled
}
Tim peaufine l'application pour la rendre plus interactive et plus conviviale.
Ajouter une case à cocher pour le contrôle des découverts :
private void InitializeComponent()
{
this.denyOverdraft = new System.Windows.Forms.CheckBox();
// Initialize other controls
this.denyOverdraft.Text = "Stop Overdrafts";
this.denyOverdraft.CheckedChanged += new System.EventHandler(this.denyOverdraft_CheckedChanged);
}
Gestion de l'état des cases à cocher :
private void denyOverdraft_CheckedChanged(object sender, EventArgs e)
{
if (denyOverdraft.Checked)
{
// Logic to stop overdraft transactions
}
}
Mise à jour du gestionnaire d'événements :
private void CheckingAccount_OverdraftEvent(object sender, OverdraftEventArgs e)
{
if (denyOverdraft.Checked)
{
e.CancelTransaction = true;
}
errorMessage.Text = $"You had an overdraft protection transfer of {e.AmountOverdrafted:C2}";
errorMessage.Visible = true;
}
Tim Corey conclut le didacticiel en résumant les points clés et les meilleures pratiques pour travailler avec des événements en C#.
Supprimer les écouteurs d'événements :
customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;RemoveHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEventUtiliser EventArgs Héritage :
Private Setters for Read-Only Properties :
Syntaxe du gestionnaire d'événements :
Opérateur inconditionnel :
Le tutoriel complet de Tim Corey sur les événements C# fournit des informations précieuses et des exemples pratiques pour créer, traiter et gérer efficacement les événements. En suivant ces bonnes pratiques, les développeurs peuvent créer des applications plus interactives et plus réactives.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy