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
}
Olayı 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);
}
Olayları Bağlama ve İşleme:
account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
private void Account_RaiseTransactionApprovedEvent(object sender, string e)
{
// Code to handle the event
}
Tim, 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);
}
Olayları 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
}
Tim 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);
}
?.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");
}
Tim, ö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);
}
Birden 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");
}
Uygulamayı Ç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
}
Hata 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);
}
Olayı 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;
}
Olayı 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;
}
Eş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;
}
}
Sı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
}
Çözüm:
public decimal AmountOverdrafted { get; private set; }
public string MoreInfo { get; private set; }
Tim 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;
}
}
Ö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;
}
Kaynağı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
}
Tim, 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);
}
Onay 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
}
}
Olay 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;
}
Tim 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