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
Ereignisse in C# sind ein grundlegendes Konzept, das viele Entwickler verwenden, aber möglicherweise nicht vollständig verstehen, insbesondere wenn es darum geht, eigene Ereignisse zu erstellen. Tim Corey bietet in seinem Video "C# Events - Creating and Consuming Events in Your Application" eine umfassende Anleitung zum Erstellen und Verwenden von Ereignissen und geht dabei auf bewährte Verfahren und erweiterte Funktionen ein.
In diesem Artikel werden wir uns mit C#-Ereignissen befassen, wobei wir uns auf ihre Syntax konzentrieren, wie sie definiert sind und wie sie bei der Lösung gängiger Programmierprobleme helfen. Das Verständnis der Ereignisbehandlung in C# ist für die Erstellung von reaktionsschnellen Anwendungen unerlässlich, und dieser Artikel wird Ihnen helfen, die Kernkonzepte der benutzerdefinierten Fehlerprotokollierung, der Ausnahmebehandlung und der ereignisgesteuerten Programmierung zu verstehen.
In C# und anderen Programmiersprachen spielen Ereignisse eine entscheidende Rolle bei der ereignisgesteuerten Programmierung, die es Anwendungen ermöglicht, auf Aktionen wie Benutzerinteraktionen oder Systemänderungen zu reagieren. Im Vergleich zu anderen Programmiersprachen bietet C# einen strukturierten Ansatz für den Umgang mit Ereignissen und ist damit ideal für schnelle und kleine Anwendungen. Ereignisse in C# werden durch bestimmte Aktionen ausgelöst, und diese Aktionen rufen entsprechende Event-Handler auf, um die gewünschten Aufgaben auszuführen.
Tim beginnt mit der Erklärung, dass die meisten Entwickler mit Ereignissen in C# vertraut sind, aber nicht wissen, wie man benutzerdefinierte Ereignisse erstellt. Ziel des Videos ist es, Ereignisse vorzustellen, die Erstellung von benutzerdefinierten Ereignissen zu erläutern, ihre Funktionen zu diskutieren und bewährte Verfahren zu beschreiben.
Tim verwendet eine einfache Bankanwendung, die mit Windows Forms (WinForms) erstellt wurde, um Ereignisse zu demonstrieren. Die Anwendung simuliert grundlegende Bankgeschäfte für einen Kunden, einschließlich der Anzeige von Salden und der Erfassung von Transaktionen.
Anwendungsübersicht:
Hauptformular:
Transaktionsformular:
Tim erklärt den Backend-Code der Demo-Bankanwendung:
Kundenklasse:
Kontenklasse:
Handhabung von Einzahlungen und Zahlungen:
Überziehungsschutz:
Code-Beispiele finden Sie direkt im Video von Tim Corey, wo er den Code von 3:18 bis 18:27 erklärt.
In diesem Abschnitt taucht Tim Corey in die Funktionsweise von Schaltflächenklickereignissen in Windows Forms ein und erklärt, wie diese Ereignisse verdrahtet sind und wie sie funktionieren.
Tim beginnt mit der Erläuterung des bekannten Konzepts der Schaltflächenklick-Ereignisse in Windows Forms-Anwendungen. Wenn Sie im Designer auf eine Schaltfläche doppelklicken, generiert Visual Studio automatisch eine Ereignisbehandlungsmethode für das Klickereignis.
Ereignishandler-Methode:
private void recordTransactionButton_Click(object sender, EventArgs e)
{
// Code to handle the button click event
}Private Sub recordTransactionButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles recordTransactionButton.Click
' Code to handle the button click event
End SubVerkabelung der Veranstaltung:
this.recordTransactionButton.Click += new System.EventHandler(this.recordTransactionButton_Click);AddHandler Me.recordTransactionButton.Click, AddressOf Me.recordTransactionButton_ClickTim erklärt, wie man benutzerdefinierte Ereignisse in C# erstellt, beginnend mit der Klasse Account, in der die Ereignisse ausgelöst werden.
Definieren eines Ereignisses:
public event EventHandler<string> RaiseTransactionApprovedEvent;Public Event RaiseTransactionApprovedEvent As EventHandler(Of String)Auslösung des Ereignisses:
this) und Ereignisdaten (in diesem Fall ein String).private void OnTransactionApproved(string transactionName)
{
RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
}Private Sub OnTransactionApproved(ByVal transactionName As String)
RaiseTransactionApprovedEvent?.Invoke(Me, transactionName)
End SubVerkabelung und Handhabung von Ereignissen:
account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
private void Account_RaiseTransactionApprovedEvent(object sender, string e)
{
// Code to handle the event
}AddHandler account.RaiseTransactionApprovedEvent, AddressOf Account_RaiseTransactionApprovedEvent
Private Sub Account_RaiseTransactionApprovedEvent(sender As Object, e As String)
' Code to handle the event
End SubTim erklärt, wie man Ereignisse verwendet, um die Browser-Benutzeroberfläche automatisch zu aktualisieren, wenn bestimmte Aktionen stattfinden, z. B. wenn eine Transaktion genehmigt wird.
Eröffnung von Veranstaltungen:
public void AddDeposit(decimal amount, string depositName)
{
// Code to add deposit
RaiseTransactionApprovedEvent?.Invoke(this, depositName);
}Public Sub AddDeposit(ByVal amount As Decimal, ByVal depositName As String)
' Code to add deposit
RaiseTransactionApprovedEvent?.Invoke(Me, depositName)
End SubAbonnieren von Ereignissen in der Benutzeroberfläche:
public MainForm()
{
InitializeComponent();
account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
}
private void Account_RaiseTransactionApprovedEvent(object sender, string e)
{
// Update the UI with the new transaction
}Public Sub New()
InitializeComponent()
AddHandler account.RaiseTransactionApprovedEvent, AddressOf Account_RaiseTransactionApprovedEvent
End Sub
Private Sub Account_RaiseTransactionApprovedEvent(sender As Object, e As String)
' Update the UI with the new transaction
End SubTim Corey erklärt die Verwendung der Syntax ?.Invoke() beim Auslösen von Ereignissen in C#. Dieser moderne Ansatz vereinfacht den Code und gewährleistet die Thread-Sicherheit.
Das Fragezeichen (?.) vor Invoke ist ein Null-Bedingungsoperator. Es wird geprüft, ob der Event-Handler null ist, bevor er aufgerufen wird, um mögliche Ausnahmen zu vermeiden.
Traditionelle Herangehensweise:
if (RaiseTransactionApprovedEvent != null)
{
RaiseTransactionApprovedEvent(this, depositName);
}If RaiseTransactionApprovedEvent IsNot Nothing Then
RaiseTransactionApprovedEvent(Me, depositName)
End IfModerne Herangehensweise mit ?.Invoke():
RaiseTransactionApprovedEvent?.Invoke(this, depositName);RaiseTransactionApprovedEvent?.Invoke(Me, depositName)RaiseTransactionApprovedEvent null ist, wird die Ausführung nicht fortgesetzt, wodurch effektiv alle Ausnahmen vermieden werden.Vorteile:
Tim erklärt, wie man auf benutzerdefinierte Ereignisse in einer Windows Forms-Anwendung hört und die Benutzeroberfläche entsprechend aktualisiert.
Abonnement für Veranstaltungen:
customer.CheckingAccount.TransactionApprovedEvent += CheckingAccount_TransactionApprovedEvent;AddHandler customer.CheckingAccount.TransactionApprovedEvent, AddressOf CheckingAccount_TransactionApprovedEventEreignishandler-Methode:
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");
}Private Sub CheckingAccount_TransactionApprovedEvent(sender As Object, e As String)
' Update the UI with the new transaction
checkingTransactionsDataSource.DataSource = Nothing
checkingTransactionsDataSource.DataSource = customer.CheckingAccount.Transactions
checkingBalanceLabel.Text = customer.CheckingAccount.Balance.ToString("C2")
End SubTim demonstriert den gesamten Prozess des Erstellens, Auslösens und Behandelns benutzerdefinierter Ereignisse in Aktion.
Auslösung des Ereignisses:
private void OnTransactionApproved(string transactionName)
{
RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
}Private Sub OnTransactionApproved(ByVal transactionName As String)
RaiseTransactionApprovedEvent?.Invoke(Me, transactionName)
End SubBehandlung mehrerer Ereignisse:
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");
}Public Sub New()
InitializeComponent()
AddHandler customer.CheckingAccount.TransactionApprovedEvent, AddressOf CheckingAccount_TransactionApprovedEvent
AddHandler customer.SavingsAccount.TransactionApprovedEvent, AddressOf SavingsAccount_TransactionApprovedEvent
End Sub
Private Sub SavingsAccount_TransactionApprovedEvent(sender As Object, e As String)
' Update the UI with the new savings transaction
savingsTransactionsDataSource.DataSource = Nothing
savingsTransactionsDataSource.DataSource = customer.SavingsAccount.Transactions
savingsBalanceLabel.Text = customer.SavingsAccount.Balance.ToString("C2")
End SubAusführen der Anwendung:
Tim zeigt, wie man Ereignisse debuggt und die mit ihnen gesendeten Informationen untersucht.
Setzen eines Haltepunkts:
private void CheckingAccount_TransactionApprovedEvent(object sender, string e)
{
// Breakpoint here
}Private Sub CheckingAccount_TransactionApprovedEvent(ByVal sender As Object, ByVal e As String)
' Breakpoint here
End SubDebugging :
Tim Corey erweitert die Demo durch die Erstellung eines weiteren benutzerdefinierten Ereignisses zur Behandlung von Überziehungssituationen. Dieses Ereignis wird ausgelöst, wenn es zu einer Überziehung kommt und informiert den Benutzer über den Überziehungsbetrag.
Tim beginnt mit der Definition eines neuen Ereignisses in der Klasse Account für Überziehungsszenarien:
Ereigniserklärung:
public event EventHandler<decimal> OverdraftEvent;Public Event OverdraftEvent As EventHandler(Of Decimal)Auslösung des Ereignisses:
if (overdraftSuccessful)
{
OverdraftEvent?.Invoke(this, overdraftAmount);
}If overdraftSuccessful Then
RaiseEvent OverdraftEvent(Me, overdraftAmount)
End IfVerkabelung der Veranstaltung:
customer.CheckingAccount.OverdraftEvent += CheckingAccount_OverdraftEvent;AddHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEventUmgang mit dem Ereignis :
private void CheckingAccount_OverdraftEvent(object sender, decimal e)
{
errorMessage.Text = $"You had an overdraft protection transfer of {e:C2}";
errorMessage.Visible = true;
}Private Sub CheckingAccount_OverdraftEvent(sender As Object, e As Decimal)
errorMessage.Text = $"You had an overdraft protection transfer of {e:C2}"
errorMessage.Visible = True
End SubAuslösen und Anzeigen des Ereignisses:
You had an overdraft protection transfer of $20.44
Tim erklärt, wie man dasselbe Ereignis in mehreren Sprachen und Formen anhören kann, um die Vielseitigkeit von Ereignissen zu demonstrieren.
Ein Etikett zu einem anderen Formular hinzufügen:
<asp:Label ID="errorMessage" runat="server" Visible="false" />
Abonnement für die Veranstaltung:
customer.CheckingAccount.OverdraftEvent += SecondaryForm_OverdraftEvent;AddHandler customer.CheckingAccount.OverdraftEvent, AddressOf SecondaryForm_OverdraftEventUmgang mit dem Ereignis :
private void SecondaryForm_OverdraftEvent(object sender, decimal e)
{
errorMessage.Visible = true;
}Private Sub SecondaryForm_OverdraftEvent(sender As Object, e As Decimal)
errorMessage.Visible = True
End SubSimultane Ereignisbehandlung:
Both the main form and the secondary form display the overdraft message when the event is triggered.
Tim hebt hervor, wie wichtig es ist, Ereignislisten zu bereinigen, um Speicherlecks zu vermeiden und eine gute Anwendungsleistung zu gewährleisten.
Abmeldung von Veranstaltungen:
customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;RemoveHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEventWarum es wichtig ist:
Verwendung von benannten Methoden:
// Good practice: using named methods for event handlers' Good practice: using named methods for event handlersTim Corey erklärt die besten Praktiken für die Übergabe von Daten durch Ereignisse, insbesondere die Vorteile der Verwendung einer Klasse anstelle von einfachen Datentypen wie String oder Decimal.
Tim beginnt mit der Frage, warum die Verwendung einfacher Datentypen für Ereignisse weniger üblich ist und warum es normalerweise besser ist, eine Klasse zu übergeben:
Flexibilität und Skalierbarkeit:
EventArgs-Vererbung:
Tim demonstriert, wie man eine benutzerdefinierte EventArgs-Klasse für das Überziehungsereignis erstellt.
Bestimmen Sie die Klasse:
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;
}
}Public Class OverdraftEventArgs
Inherits EventArgs
Public Property AmountOverdrafted As Decimal
Public Property MoreInfo As String
Public Sub New(amountOverdrafted As Decimal, moreInfo As String)
Me.AmountOverdrafted = amountOverdrafted
Me.MoreInfo = moreInfo
End Sub
End ClassVerwendung der Klasse in der Veranstaltung:
public event EventHandler<OverdraftEventArgs> OverdraftEvent;Public Event OverdraftEvent As EventHandler(Of OverdraftEventArgs)Auslösung des Ereignisses:
OverdraftEvent?.Invoke(this, new OverdraftEventArgs(amountNeeded, "Additional info"));OverdraftEvent?.Invoke(Me, New OverdraftEventArgs(amountNeeded, "Additional info"))Tim betont, wie wichtig es ist, schreibgeschützte Eigenschaften in der EventArgs-Klasse zu verwenden, um eine versehentliche Änderung von Ereignisdaten zu verhindern.
Änderungen vermeiden:
Beispiel für das Problem:
private void CheckingAccount_OverdraftEvent(object sender, OverdraftEventArgs e)
{
e.AmountOverdrafted = 1000; // This modification affects all handlers
}Private Sub CheckingAccount_OverdraftEvent(sender As Object, e As OverdraftEventArgs)
e.AmountOverdrafted = 1000 ' This modification affects all handlers
End SubLösung:
public decimal AmountOverdrafted { get; private set; }
public string MoreInfo { get; private set; }Public Property AmountOverdrafted As Decimal
Public Property MoreInfo As StringTim Corey weist auf eine wichtige Ausnahme von der Regel hin, private Setter für Ereignisdateneigenschaften zu verwenden. Diese Ausnahme ist dann gegeben, wenn Sie es den Zuhörern von Ereignissen erlauben müssen, die Ereignisdaten zu ändern, z. B. in Fällen, in denen eine Transaktion aufgrund bestimmter Bedingungen abgebrochen werden kann.
Tim gibt ein Beispiel, bei dem ein Event-Handler eine Transaktion abbrechen muss. Dies wird durch Hinzufügen einer CancelTransaction-Eigenschaft zur benutzerdefinierten EventArgs-Klasse erreicht.
Definieren der Eigenschaft:
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;
}
}Public Class OverdraftEventArgs
Inherits EventArgs
Public Property AmountOverdrafted As Decimal
Public Property MoreInfo As String
Public Property CancelTransaction As Boolean = False
Public Sub New(amountOverdrafted As Decimal, moreInfo As String)
Me.AmountOverdrafted = amountOverdrafted
Me.MoreInfo = moreInfo
End Sub
End ClassEigenschaft im Event Handler einstellen:
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;
}Private Sub CheckingAccount_OverdraftEvent(ByVal sender As Object, ByVal e As OverdraftEventArgs)
If denyOverdraft.Checked Then
e.CancelTransaction = True
End If
errorMessage.Text = $"You had an overdraft protection transfer of {e.AmountOverdrafted:C2}"
errorMessage.Visible = True
End SubPrüfen der Eigenschaft in der Quellmethode:
if (args.CancelTransaction)
{
return false; // Transaction is canceled
}If args.CancelTransaction Then
Return False ' Transaction is canceled
End IfTim verfeinert die Anwendung weiter, um sie interaktiver und benutzerfreundlicher zu gestalten.
Hinzufügen eines Kontrollkästchens für die Überziehungskontrolle:
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);
}Private Sub InitializeComponent()
Me.denyOverdraft = New System.Windows.Forms.CheckBox()
' Initialize other controls
Me.denyOverdraft.Text = "Stop Overdrafts"
AddHandler Me.denyOverdraft.CheckedChanged, AddressOf Me.denyOverdraft_CheckedChanged
End SubHandhabung des Checkbox-Status:
private void denyOverdraft_CheckedChanged(object sender, EventArgs e)
{
if (denyOverdraft.Checked)
{
// Logic to stop overdraft transactions
}
}Private Sub denyOverdraft_CheckedChanged(sender As Object, e As EventArgs) Handles denyOverdraft.CheckedChanged
If denyOverdraft.Checked Then
' Logic to stop overdraft transactions
End If
End SubAktualisierung des Event Handlers:
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;
}Private Sub CheckingAccount_OverdraftEvent(ByVal sender As Object, ByVal e As OverdraftEventArgs)
If denyOverdraft.Checked Then
e.CancelTransaction = True
End If
errorMessage.Text = $"You had an overdraft protection transfer of {e.AmountOverdrafted:C2}"
errorMessage.Visible = True
End SubTim Corey fasst zum Abschluss des Tutorials die wichtigsten Punkte und bewährten Verfahren für die Arbeit mit Ereignissen in C# zusammen.
Ereignis-Listener entfernen:
customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;RemoveHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEventVerwendung EventArgs Vererbung:
Private Setter für schreibgeschützte Eigenschaften:
Syntax für Ereignisbehandler :
Null-Bedingungs-Operator:
Tim Coreys umfassendes Tutorial zu C#-Ereignissen bietet wertvolle Einblicke und praktische Beispiele für die Erstellung, Handhabung und Verwaltung von Ereignissen. Durch die Befolgung dieser Best Practices können Entwickler interaktivere und reaktionsschnellere Anwendungen erstellen.
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