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
C#'ta olaylar birçok geliştiricinin kullandığı, fakat kendi olaylarını oluştururken tam olarak anlamadıkları temel bir konsepttir. Tim Corey, olayları nasıl oluşturacağınızı ve kullanacağınızı, en iyi uygulamaları keşfederek ve C# Events - Creating and Consuming Events in Your Application başlıklı videosunda gelişmiş özellikleri açıklayarak kapsamlı bir kılavuz sunuyor.
Bu makalede C# olaylarını inceleyeceğiz, bunların sözdizimine, nasıl tanımlandığına ve Tim Corey'nin video örneklerini kullanarak yaygın programlama sorunlarını nasıl çözdüğüne odaklanacağız. C#'ta olay işleme anlayışı, duyarlı uygulamalar oluşturmak için gereklidir ve bu makale, özel hata günlüğü, istisna işleme ve olay yönelimli programlama temel kavramlarını kavramanıza yardımcı olacaktır.
C# ve diğer programlama dillerinde, olaylar olay yönelimli programlamada kritik bir rol oynar, uygulamaların kullanıcı etkileşimleri veya sistem değişiklikleri gibi eylemlere yanıt vermesini sağlar. Diğer programlama dilleriyle karşılaştırıldığında, C# olayları ele almayı yapılandırılmış bir yaklaşımla sunar, bu da onu hem hızlı hem de küçük uygulamalar için ideal kılar. C#'ta olaylar belirli eylemlerle tetiklenir ve bu eylemler, istenen görevleri gerçekleştirmek için karşılık gelen olay işleyicileri çağırır.
Tim, çoğu geliştiricinin C#'ta olaylar konusunda bilgili olduğunu, fakat özel olaylar oluşturmayı bilmediğini açıklayarak başlıyor. Videonun amacı olayları tanıtmak, özel olaylar oluşturmayı, özelliklerini tartışmak ve en iyi uygulamaları ana hatlarıyla sunmaktır.
Tim, olayı göstermek için Windows Forms (WinForms) ile oluşturulmuş basit bir bankacılık uygulaması kullanıyor. Uygulama, bir müşteri için temel bankacılık işlemlerini simüle ediyor, bakiyeleri görüntüleme ve işlemleri kaydetme dahil.
Uygulama Genel Bakışı:
Ana Form:
İşlem Formu:
Tim, demo bankacılık uygulamasının arka plan kodunu açıklar:
Müşteri Sınıfı:
Hesap Sınıfı:
Mevduat ve Ödeme İşlemi:
Eksiklik Koruması:
Kod örnekleri için, Tim Corey'nin 3:18 ile 18:27 arası kodu açıkladığı videoya direkt olarak başvurabilirsiniz.
Bu bölümde, Tim Corey, Windows Forms'da düğme tıklama olaylarının nasıl işlediğine daldı, bu olayların nasıl bağlandığını ve nasıl çalıştığını açıkladı.
Tim, Windows Forms uygulamalarındaki düğme tıklama olaylarının tanıdık kavramını açıklayarak başlıyor. Tasarımcıda bir düğmeye çift tıkladığınızda, Visual Studio, tıklama olayı için otomatik olarak bir olay işleyici yöntemi oluşturur.
Olay İşleyici Yöntemi:
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 SubOlayı Bağlamak:
this.recordTransactionButton.Click += new System.EventHandler(this.recordTransactionButton_Click);AddHandler Me.recordTransactionButton.Click, AddressOf Me.recordTransactionButton_ClickTim, C#'ta özel olayları nasıl oluşturacağınızı, olayların tetikleneceği Hesap sınıfından başlayarak açıklar.
Olay Tanımlama:
public event EventHandler<string> RaiseTransactionApprovedEvent;Public Event RaiseTransactionApprovedEvent As EventHandler(Of String)Olayı Tetikleme:
this) ve olay verileri (bu durumda, bir string).private void OnTransactionApproved(string transactionName)
{
RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
}Private Sub OnTransactionApproved(ByVal transactionName As String)
RaiseTransactionApprovedEvent?.Invoke(Me, transactionName)
End SubOlayları Bağlama ve İşleme:
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, belirli eylemler meydana geldiğinde, örneğin bir işlem onaylandığında tarayıcı kullanıcı arayüzünü otomatik olarak güncelleyebilmek için olayları nasıl kullanacağınızı açıklıyor.
Olayları Yükseltme:
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 SubOlayları UI'da İmzalama:
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, C#'ta olayları yükseltirken ?.Invoke() sözdizimini açıklıyor. Bu modern yaklaşım kodu basitleştirir ve iplik güvenliği sağlar.
Invoke'dan önceki soru işareti (?.) null-şartlı bir operatördür. Olay işleyicisinin null olup olmadığını kontrol eder, potansiyel hataları önler.
Geleneksel Yaklaşım:
if (RaiseTransactionApprovedEvent != null)
{
RaiseTransactionApprovedEvent(this, depositName);
}If RaiseTransactionApprovedEvent IsNot Nothing Then
RaiseTransactionApprovedEvent(Me, depositName)
End If?.Invoke() ile Modern Yaklaşım:
RaiseTransactionApprovedEvent?.Invoke(this, depositName);RaiseTransactionApprovedEvent?.Invoke(Me, depositName)RaiseTransactionApprovedEvent null ise, çağrı gerçekleşmez, bu da herhangi bir istisnadan kaçınmaya etkili bir şekilde olanak sağlar.Faydalar:
Tim, Windows Forms uygulamasında özel olayları nasıl dinleyeceğinizi ve kullanıcı arayüzünü buna göre nasıl güncelleyeceğinizi açıklar.
Olaylara Abone Olma:
customer.CheckingAccount.TransactionApprovedEvent += CheckingAccount_TransactionApprovedEvent;AddHandler customer.CheckingAccount.TransactionApprovedEvent, AddressOf CheckingAccount_TransactionApprovedEventOlay İşleyici Yöntemi:
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, özel olayları oluşturma, yükseltme ve işleme sürecinin tamamını harekete geçirme aşamasında gösteriyor.
Olayı Tetikleme:
private void OnTransactionApproved(string transactionName)
{
RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
}Private Sub OnTransactionApproved(ByVal transactionName As String)
RaiseTransactionApprovedEvent?.Invoke(Me, transactionName)
End SubBirden Fazla Olayı İşleme:
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 SubUygulamayı Çalıştırma:
Tim, olayları nasıl hata ayıklayacağınızı ve onlarla gönderilen bilgileri nasıl inceleyeceğinizi gösterir.
Bir Kesme Noktası Ayarlama:
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 SubHata Ayıklama:
Tim Corey, eksiklik durumlarını ele almak için başka bir özel olay oluşturarak demoyu genişletiyor. Bu olay, bir eksiklik meydana geldiğinde tetiklenecek ve kullanıcıya eksiklik miktarını bildirecektir.
Tim, Hesap sınıfında eksiklik senaryoları için yeni bir olay tanımlayarak başlıyor:
Olay Beyanı:
public event EventHandler<decimal> OverdraftEvent;Public Event OverdraftEvent As EventHandler(Of Decimal)Olayı Tetikleme:
if (overdraftSuccessful)
{
OverdraftEvent?.Invoke(this, overdraftAmount);
}If overdraftSuccessful Then
RaiseEvent OverdraftEvent(Me, overdraftAmount)
End IfOlayı Bağlamak:
customer.CheckingAccount.OverdraftEvent += CheckingAccount_OverdraftEvent;AddHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEventOlayı İşleme:
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 SubOlayı Tetikleme ve Görüntüleme:
You had an overdraft protection transfer of $20.44
Tim, olayların birden fazla konumda ve formda aynı anda dinlenebildiğini
Başka Bir Forma Etiket Ekleme:
<asp:Label ID="errorMessage" runat="server" Visible="false" />
Olaylara Abone Olma:
customer.CheckingAccount.OverdraftEvent += SecondaryForm_OverdraftEvent;AddHandler customer.CheckingAccount.OverdraftEvent, AddressOf SecondaryForm_OverdraftEventOlayı İşleme:
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 SubEşzamanlı Olay İşleme:
Both the main form and the secondary form display the overdraft message when the event is triggered.
Tim, olay dinleyicilerini temizlemenin hafıza sızıntılarını önlemek ve düzgün uygulama performansını sağlamak için önemini vurgular.
Olaylardan Çıkma:
customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;RemoveHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEventNeden Önemlidir:
Adlandırılmış Yöntemleri Kullanma:
// Good practice: using named methods for event handlers' Good practice: using named methods for event handlersTim Corey, olaylar üzerinden veri geçirme konusunda en iyi uygulamaları, özellikle string veya decimal gibi basit veri türleri yerine sınıf kullanmanın faydalarını açıklar.
Tim, olaylar için basit veri türlerini kullanmanın neden daha az yaygın olduğunu ve neden genellikle bir sınıf geçmenin daha iyi olduğunu tartışarak başlar:
Esneklik ve Ölçeklenebilirlik:
EventArgs Mirası:
Tim, eksiklik olayı için özel bir EventArgs sınıfı nasıl oluşturulacağını gösterir.
Sınıfı Tanımlayın:
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 ClassSınıfı Olayda Kullanma:
public event EventHandler<OverdraftEventArgs> OverdraftEvent;Public Event OverdraftEvent As EventHandler(Of OverdraftEventArgs)Olayı Tetikleme:
OverdraftEvent?.Invoke(this, new OverdraftEventArgs(amountNeeded, "Additional info"));OverdraftEvent?.Invoke(Me, New OverdraftEventArgs(amountNeeded, "Additional info"))Tim, olay verilerinin yanlışlıkla değiştirilmesini önlemek için EventArgs sınıfında salt okunur özellikler kullanmanın önemini vurgular.
Değişikliklerden Kaçınmak:
Sorunun Örneği:
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 SubÇözüm:
public decimal AmountOverdrafted { get; private set; }
public string MoreInfo { get; private set; }Public Property AmountOverdrafted As Decimal
Public Property MoreInfo As StringTim Corey, olay verisi özellikleri için özel ayarlayıcılar kullanma kuralının önemli bir istisnasını vurgular. Bu istisna, olay dinleyicilerinin olay verilerini değiştirmesine izin vermeniz gerektiğinde, örneğin bir işlemin belirli koşullar altında iptal edilmesi durumlarında ortaya çıkar.
Tim, bir olay işleyicisinin bir işlemi iptal etmesi gerektiği bir örnek sunar. Bu, özel EventArgs sınıfına bir CancelTransaction özelliği ekleyerek gerçekleştirilir.
Özelliği Tanımlamak:
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 ClassÖzelliği Olay İşleyiciye Ayarlamak:
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 SubKaynağın İçindeki Özelliği Kontrol Etme:
Olayı tetikleyen yöntemde, işlemeden önce CancelTransaction özelliğinin true olarak ayarlanıp ayarlanmadığını kontrol edin.
if (args.CancelTransaction)
{
return false; // Transaction is canceled
}If args.CancelTransaction Then
Return False ' Transaction is canceled
End IfTim, uygulamayı daha etkileşimli ve kullanıcı dostu hale getirmek için daha da geliştirir.
Kullanıcının aşırı çekim korumasını etkinleştirmesine veya devre dışı bırakmasına izin veren bir onay kutusunu forma ekleyin.
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 SubOnay kutusu için olay işleyicisinde, bir işlemi iptal etmeye karar verirken onay kutusunun durumunu dikkate almak için mantığı güncelleyin.
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 SubOlay işleyicisinin, aşırı çekimlere izin vermek veya reddetmek için onay kutusunun durumuna saygı göstermesini sağlayın.
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, C# ile olaylarla çalışırken dikkate alınması gereken önemli noktaları ve en iyi uygulamaları özetleyerek öğreticiyi tamamlar.
Bellek sızıntılarını önlemek için nesneleri yok etmeden önce her zaman olay dinleyicileri kaldırın.
Olay aboneliğinden çıkmak için -= operatörünü kullanın.
customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;RemoveHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEventTim Corey'nin C# olayları hakkındaki kapsamlı öğreticisi, olayları etkili bir şekilde oluşturmak, yönetmek ve kullanmak için değerli bilgiler ve pratik örnekler sağlar. Bu en iyi uygulamaları takip ederek, geliştiriciler daha etkileşimli ve duyarlı uygulamalar oluşturabilir.
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