Altbilgi içeriğine atla
Iron Academy Logo
C# Öğrenin
C# Öğrenin

Diğer Kategoriler

C# Olayını Anlamak

Tim Corey
1h 9m 13s

C#'de olaylar, birçok geliştiricinin kullandığı ancak kendi olaylarını oluşturma konusunda tam olarak anlayamadığı temel bir kavramdır. Tim Corey, olayları nasıl oluşturup kullanacağınıza dair kapsamlı bir rehber sunar, en iyi uygulamaları ve gelişmiş özellikleri keşfederken "C# Olayları - Uygulamanızda Olay Oluşturma ve Tüketme" adlı videosunda incelemeler yapar.

Bu makalede, C# olaylarını keşfedeceğiz. Tim Corey'nin video örneklerini kullanarak sözdizimini, nasıl tanımlandıklarını ve yaygın programlama sorunlarını nasıl çözdüklerini inceleyeceğiz. C#'de olayları yönetmek, duyarlı uygulamalar geliştirmek için esastır ve bu makale, özel hata kaydı, istisna yönetimi ve olay güdümlü programlama gibi temel kavramları anlamanıza yardımcı olacaktır.

Olaylara Giriş

C# ve programlama dillerinde olaylar, olay güdümlü programlamanın kritik bir parçasını oluşturur ve 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# olay yönetimine yapılandırılmış bir yaklaşım sunar ve hem hızlı hem de küçük uygulamalar için idealdir. C#'de olaylar belirli eylemlerle tetiklenir ve bu eylemler, istenen görevleri yerine getiren ilgili olay işleyicilerini çağırır.

Tim, birçok geliştiricinin C# olaylarıyla aşina olduğunu ancak özel olaylar oluşturmanın nasıl yapılacağını bilmediğini açıklayarak başlar. Videonun amacı olayları tanıtmak, özel olaylar oluşturmayı göstermek, onların özelliklerini tartışmak ve en iyi uygulamaları özetlemektir.

Demo Uygulama Yürütümü

Tim, olayları göstermek için Windows Forms (WinForms) ile oluşturulmuş basit bir bankacılık uygulaması kullanır. Uygulama, bir müşteri için temel bankacılık işlemlerini simüle eder, bakiyeleri görüntülemeyi ve işlemleri kaydetmeyi içerir.

  1. Uygulama Genel Bakışı:

    • Uygulamanın hesap bakiyelerini ve işlemleri göstermek için bir formu ve yeni işlemleri kaydetmek için başka bir formu vardır.
    • Kredi kartı alışverişlerini simüle etmek ve birikim hesabından kontrol hesabına fon transferleriyle fazla çekişleri yönetmek için düğmeler içerir.
  2. Ana Form:

    • Müşterinin adı, kontrol ve birikim hesabı bakiyelerini gösterir.
    • Her iki hesap için işlem listelerini gösterir.
    • İşlem kaydı formunu açmak için bir düğme içerir.
  3. İşlem Formu:

    • Kullanıcının işlem miktarlarını girmesine imkan tanır.
    • Alışveriş yapmayı simüle eder ve fazla çekişleri birikimden kontrol hesabına fon transferleriyle yönetir.

Demo Uygulamanın Ardındaki Kod

Tim, demo bankacılık uygulamasının backend kodunu açıklar:

  1. Müşteri Sınıfı:

    • Müşterinin adını ve iki hesabını (kontrol ve birikim) gösteren özelliklere sahip bir müşteriyi temsil eder.
    • Müşteri sınıfı basittir ancak birden fazla hesabı yönetmeyi anlamak için iyi bir başlangıç noktasıdır.
  2. Hesap Sınıfı:

    • Hesap adı, bakiye ve işlem listesi dahil olmak üzere bir bankacılık hesabının ayrıntılarını yönetir.
    • Bakiye özelliği, kesin mali hesaplamalar için ondalık (decimal) tipindedir.
    • İşlemler özelliği, dışardan değişiklik önlemek için salt okunurdur.
  3. Mevduat ve Ödemeleri Yönetme:

    • Mevduat Ekle Metodu: Hesaba bir mevduat ekler, bakiyeyi günceller ve işlemi kaydeder.
    • Ödeme Yap Metodu: Yeterli bakiye olup olmadığını kontrol ederek para çekme işlemlerini yönetir ve gerekirse yedek bir hesaptan fon transfer etme yoluyla fazla çekiş korumasını yönetir.
  4. Fazla Çekiş Koruması:

    • Uygulama fazla çekişleri yönetmek için bir mantık içerir. Eğer kontrol hesabının bakiyesi bir işlem için yeterli değilse, uygulama eksikliği karşılamak için birikim hesabını kontrol eder. Birleştirilmiş bakiye yeterli ise, gereken miktarı kontrol hesabına aktarır ve işlemi tamamlar.

Kod örnekleri için, Tim Corey'nin videonun 3:18 ile 18:27 dakika arasını doğrudan inceleyebilirsiniz.

Olay: Düğme Tıkla

Bu bölümde, Tim Corey, Windows Forms'ta düğme tıklama olaylarının nasıl çalıştığını, bu olayların nasıl bağlandığını ve nasıl işlediğini ayrıntılı olarak açıklar.

Düğme Tıklama Olaylarını Anlamak

Tim, Windows Forms uygulamalarında düğme tıklama olaylarının tanıdık konseptiyle açıklamaya başlar. Tasarlayıcıda bir düğmeye çift tıkladığınızda, Visual Studio, tıklama olayı için otomatik olarak bir olay işleyici metodu oluşturur.

  1. Olay İşleyici Metodu:

    • Bu metod, düğmeye her tıklandığında çağrılır. Bu, düğme tıklamasına yanıt olarak çalışacak kodun yerleştirildiği yerdir.
    private void recordTransactionButton_Click(object sender, EventArgs e)
    {
       // Code to handle the button click event
    }
    private void recordTransactionButton_Click(object sender, EventArgs e)
    {
       // Code to handle the button click event
    }
  2. Olayı Bağlama:

    • Olay işleyici metodu, formun tasarımcısı dosyasında (FormName.Designer.cs) düğme tıklama olayına bağlanır. Bu, düğmenin tıklama olayına olay işleyiciyi eklemek için += operatörü kullanılarak yapılır.
    this.recordTransactionButton.Click += new System.EventHandler(this.recordTransactionButton_Click);
    this.recordTransactionButton.Click += new System.EventHandler(this.recordTransactionButton_Click);

Özel Olaylar Oluşturma ve Çağırma

Tim, C#'ta özel olayları nasıl oluşturacağını, olayların tetikleneceği Hesap sınıfıyla başlayarak açıklar.

  1. Bir Olay Tanımlama:

    • Bir olay, event anahtar kelimesi kullanılarak tanımlanır. Bu, genel bir değişkene benzer ancak özellikle olaylar içindir.
    public event EventHandler<string> RaiseTransactionApprovedEvent;
    public event EventHandler<string> RaiseTransactionApprovedEvent;
  2. Olayı Tetikleme:

    • Olaylar genellikle olayı tanımlayan sınıf içinde Invoke yöntemi kullanılarak tetiklenir. Invoke metodu iki parametre alır: gönderici (genellikle this) ve olay verileri (bu durumda bir dize).
    private void OnTransactionApproved(string transactionName)
    {
       RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
    }
    private void OnTransactionApproved(string transactionName)
    {
       RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
    }
  3. Olayları Bağlama ve Yönetme:

    • += operatörünü kullanarak olaya abone olun ve olay tetiklendiğinde olayı yönetmek için bir yöntem tanımlayın.
    account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
    
    private void Account_RaiseTransactionApprovedEvent(object sender, string e)
    {
       // Code to handle the event
    }
    account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
    
    private void Account_RaiseTransactionApprovedEvent(object sender, string e)
    {
       // Code to handle the event
    }

UI'yi Güncellemek için Olayları Kullanma

Tim, belirli işlemler meydana geldiğinde, örneğin bir işlem onaylandığında tarayıcı kullanıcı arayüzünü otomatik olarak nasıl güncelleyeceğinizi açıklar.

  1. Olayları Tetikleme:

    • Bir işlem onaylandıktan sonra özel olayı tetikleyin.
    public void AddDeposit(decimal amount, string depositName)
    {
       // Code to add deposit
       RaiseTransactionApprovedEvent?.Invoke(this, depositName);
    }
    public void AddDeposit(decimal amount, string depositName)
    {
       // Code to add deposit
       RaiseTransactionApprovedEvent?.Invoke(this, depositName);
    }
  2. UI'da Olaylara Abone Olma:

    • Bir işlem onaylandığında işlem listesini güncellemek üzere ana formda olaya abone olun.
    public MainForm()
    {
       InitializeComponent();
       account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
    }
    
    private void Account_RaiseTransactionApprovedEvent(object sender, string e)
    {
       // Update the UI with the new transaction
    }
    public MainForm()
    {
       InitializeComponent();
       account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
    }
    
    private void Account_RaiseTransactionApprovedEvent(object sender, string e)
    {
       // Update the UI with the new transaction
    }

Event?.Invoke() Açıklaması

Tim Corey, C#'da olayları tetiklerken ?.Invoke() sözdiziminin kullanımını açıklar. Bu modern yaklaşım, kodu basitleştirir ve iş parçacığı güvenliğini sağlar.

Soru İşareti Operatörü

Invoke'dan önceki soru işareti (?.) bir null koşullu operatördür. Olay işleyicisinin null olup olmadığını kontrol eder ve olası hataları önler.

  1. Geleneksel Yaklaşım:

    • Eskiden geliştiriciler, olay işleyicisinin null olup olmadığını kontrol etmek ve sonra tetiklemek için birden fazla satır kod kullanırlardı.
    if (RaiseTransactionApprovedEvent != null)
    {
       RaiseTransactionApprovedEvent(this, depositName);
    }
    if (RaiseTransactionApprovedEvent != null)
    {
       RaiseTransactionApprovedEvent(this, depositName);
    }
  2. ?.Invoke() ile Modern Yaklaşım:

    • Null koşullu operatör, bu süreci basitleştirir, null kontrolü yapar ve olayı tek bir satırda tetikler.
    RaiseTransactionApprovedEvent?.Invoke(this, depositName);
    RaiseTransactionApprovedEvent?.Invoke(this, depositName);
    • Eğer RaiseTransactionApprovedEvent null ise, çağrı ilerlemez ve bu sayede herhangi bir istisna fırlatılması önlenir.
  3. Faydaları:

    • Kodu Basitleştirir: Olayları güvenli şekilde tetiklemek için gereken kod miktarını azaltır.
    • İş Parçacığı Güvenliği: Null kontrolü yaparak ve olayı tek adımda tetikleyerek yarış koşullarını ortadan kaldırır.

Olayı Dinleme ve Kod Yazma

Tim, bir Windows Forms uygulamasında özel olayları dinlemeyi ve kullanıcı arayüzünü buna göre güncellemeyi açıklar.

  1. Olaylara Abone Olma:

    • += operatörünü kullanarak özel olaya abone olun.
    customer.CheckingAccount.TransactionApprovedEvent += CheckingAccount_TransactionApprovedEvent;
    customer.CheckingAccount.TransactionApprovedEvent += CheckingAccount_TransactionApprovedEvent;
  2. Olay İşleyici Yöntemi:

    • Olayı yönetmek için bir yöntem tanımlayın. Bu yöntem, olay verilerine dayalı olarak kullanıcı arayüzünü günceller.
    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 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");
    }

Özel Olayı Oluşturma: Olay Uygulamada ve Özet

Tim, özel olayları oluşturma, tetikleme ve yönetme sürecini uygulamada gösterir.

  1. Olayı Tetikleme:

    • Bir işlem onaylandıktan sonra veya bakiye değiştiğinde olayı tetikleyin.
    private void OnTransactionApproved(string transactionName)
    {
       RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
    }
    private void OnTransactionApproved(string transactionName)
    {
       RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
    }
  2. Birkaç Olayı Yönetme:

    • Başka bir değişiklik meydana geldiğinde kullanıcı arayüzünü güncel tutmak için uygulamanın birden fazla olayı dinlemesini sağlayın.
    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 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");
    }
  3. Uygulamayı Çalıştırma:

    • Tim, işlemler tarafından tetiklenen olaylara göre kullanıcı arayüzünün otomatik olarak nasıl güncellendiğini gösterir.

Olay Argüman Bilgileri: Hata Ayıklama

Tim, olayları hata ayıklama ve olaylarla birlikte gönderilen bilgileri inceleme yollarını gösterir.

  1. Bir Kesme Noktası Ayarlama:

    • Olay işleyici yönteminde olay verilerini incelemek için bir kesme noktası ayarlayın.
    private void CheckingAccount_TransactionApprovedEvent(object sender, string e)
    {
       // Breakpoint here
    }
    private void CheckingAccount_TransactionApprovedEvent(object sender, string e)
    {
       // Breakpoint here
    }
  2. Hata Ayıklama:

    • Uygulamayı çalıştırın ve olayı tetikleyen bir işlem gerçekleştirin. Hata ayıklayıcıda olay argümanlarını inceleyin.
    • Gönderen parametresi, olayı tetikleyen örneği sağlar, e parametresi de olay verilerini içerir.

Başka Bir Özel Olay Oluşturma (Çekilir Hesap Etkinliği)

Tim Corey, çekilir hesap durumlarını yönetmek için başka bir özel olay oluşturarak gösterimi genişletir. Bu olay çekilir hesap durumu oluştuğunda tetiklenecek ve kullanıcıya çekilir miktarı bildirecektir.

Çekilir Hesap Olayını Tanımlama

Tim çekilir hesap senaryoları için Account sınıfında yeni bir olay tanımlayarak başlar:

  1. Olay Beyanı:

    • Olayı bir ondalık türüyle, çekilir miktarı iletmek için event anahtar kelimesiyle tanımlayın.
    public event EventHandler<decimal> OverdraftEvent;
    public event EventHandler<decimal> OverdraftEvent;
  2. Olayı Tetikleme:

    • Olay, bir çekilir hesap durumu başarıyla gerçekleştiğinde kodun o kısmında tetiklenir.
    if (overdraftSuccessful)
    {
       OverdraftEvent?.Invoke(this, overdraftAmount);
    }
    if (overdraftSuccessful)
    {
       OverdraftEvent?.Invoke(this, overdraftAmount);
    }

Çekilir Olayına Gösterge Paneli Tarafında Abone Olma

  1. Olayı Bağlama:

    • Gösterge paneli formunda çekilir olaya abone olun.
    customer.CheckingAccount.OverdraftEvent += CheckingAccount_OverdraftEvent;
    customer.CheckingAccount.OverdraftEvent += CheckingAccount_OverdraftEvent;
  2. Olayı Yönetme:

    • Çekilir hesap durumu oluştuğunda bir mesaj görüntülemek için olay işleyicisi tanımlayın.
    private void CheckingAccount_OverdraftEvent(object sender, decimal e)
    {
       errorMessage.Text = $"You had an overdraft protection transfer of {e:C2}";
       errorMessage.Visible = true;
    }
    private void CheckingAccount_OverdraftEvent(object sender, decimal e)
    {
       errorMessage.Text = $"You had an overdraft protection transfer of {e:C2}";
       errorMessage.Visible = true;
    }
  3. Olayı Tetikleme ve Görüntüleme:

    • Çekilir hesap durumu oluştuğunda, olay tetiklenir ve kullanıcıyı bilgilendirmek için kullanıcı arayüzü güncellenir.
    You had an overdraft protection transfer of $20.44

Olayı Birden Çok Yerde Dinleme

Tim, olayların birden fazla konumda ve formda aynı anda dinlenebildiğini ve olayların çok yönlülüğünü gösterir.

  1. Diğer Bir Forma Etiket Ekleme:

    • İkincil bir forma çekilir hesap mesajlarını göstermek için bir etiket ekleyin.
    <asp:Label ID="errorMessage" runat="server" Visible="false" />
    <asp:Label ID="errorMessage" runat="server" Visible="false" />
    HTML
  2. Olaya Abone Olma:

    • İkincil formda çekilir olaya abone olun.
    customer.CheckingAccount.OverdraftEvent += SecondaryForm_OverdraftEvent;
    customer.CheckingAccount.OverdraftEvent += SecondaryForm_OverdraftEvent;
  3. Olayı Yönetme:

    • İkincil formda çekilir hesap mesajını görüntülemek için olay işleyici tanımlayın.
    private void SecondaryForm_OverdraftEvent(object sender, decimal e)
    {
       errorMessage.Visible = true;
    }
    private void SecondaryForm_OverdraftEvent(object sender, decimal e)
    {
       errorMessage.Visible = true;
    }
  4. Eşzamanlı Olay Yönetimi:

    • Tim, olayın birden fazla formda eşzamanlı olarak nasıl yönetilebileceğini ve uygulamanın ilgili tüm bölümlerinin olaya uygun şekilde yanıt vererek nasıl tetiklenebileceğini gösterir.
    Both the main form and the secondary form display the overdraft message when the event is triggered.

Olay Dinleyicilerini Hafızadan Kaldırma

Tim, hafıza sızıntılarını önlemek ve uygulamanın doğru performansını sağlamak için olay dinleyicilerini temizlemenin önemini vurgular.

  1. Olaylardan Çıkış Yapma:

    • Bir sınıf örneğini yok etmeden veya bir formu kapatmadan önce olaylardan çıkış yapmak çok önemlidir.
    customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;
    customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;

    Neden Önemlidir?:

    • Olaylardan çıkış yapmamak, olayları dinleyen nesnelerin doğru şekilde çöp toplanmaması nedeniyle hafıza sızıntılarına neden olabilir.
  2. Adlandırılmış Yöntemler Kullanma:

    • Olay işleyicileri için anonim fonksiyonlar kullanmaktan kaçının çünkü olaylardan çıkış yapmak zorlaşır.
    // Good practice: using named methods for event handlers
    // Good practice: using named methods for event handlers

Generic EventHandler: T için Bir Sınıf Geçişi

Tim Corey, olaylar aracılığıyla veri iletmenin en iyi uygulamalarını, özellikle bir sınıf kullanmanın, basit veri türleri gibi string veya decimal kullanmaktan daha faydalı olduğunu açıklar.

Olay Verileri için Neden Bir Sınıf Kullanılır?

Tim, olaylar için basit veri türlerinin kullanımının neden daha yaygın olmadığını ve bunun yerine neden bir sınıf geçirmenin genellikle daha iyi olduğunu tartışarak başlar:

  1. Esneklik ve Ölçeklenebilirlik:

    • Bir sınıf kullanmak, ilgili birden fazla veri parçasını bir olay aracılığıyla iletmenize olanak tanır. Daha sonra daha fazla veri eklemeniz gerekirse, olayın imzasını değiştirmeden sadece sınıfı genişletebilirsiniz.
  2. EventArgs Kalıtımı:

    • Eskiden olay aracılığıyla iletilen herhangi bir nesnenin EventArgs'den türemesi gerekiyordu, ancak artık bu durum böyle değil. Yine de, EventArgs'den türetmek tutarlılık ve açıklık açısından faydalı olabilir.

Çekilir Hesap EventArgs Sınıfını Oluşturma

Tim, çekilir hesap olayı için özel bir EventArgs sınıfı oluşturmayı gösterir.

  1. Sınıfı Tanımlayın:

    • EventArgs'den türeyen ve olay aracılığıyla iletmek istediğiniz veriler için özellikler içeren yeni bir sınıf oluşturun.
    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 : EventArgs
    {
       public decimal AmountOverdrafted { get; private set; }
       public string MoreInfo { get; private set; }
    
       public OverdraftEventArgs(decimal amountOverdrafted, string moreInfo)
       {
           AmountOverdrafted = amountOverdrafted;
           MoreInfo = moreInfo;
       }
    }
  2. Olayda Sınıfı Kullanma:

    • Olay beyanını, özel EventArgs sınıfını kullanacak şekilde güncelleyin.
    public event EventHandler<OverdraftEventArgs> OverdraftEvent;
    public event EventHandler<OverdraftEventArgs> OverdraftEvent;
  3. Olayı Tetikleme:

    • Olayı tetiklerken, özel EventArgs sınıfının bir örneğini iletin.
    OverdraftEvent?.Invoke(this, new OverdraftEventArgs(amountNeeded, "Additional info"));
    OverdraftEvent?.Invoke(this, new OverdraftEventArgs(amountNeeded, "Additional info"));

Sadece Okuma Özelliklerinin Önemi

Tim, olay verilerinin kazara değiştirilmesini önlemek için EventArgs sınıfında salt okunur özellikler kullanmanın önemini vurgular.

  1. Değişikliklerden Kaçınma:

    • EventArgs sınıfındaki özelliklerin genel setter'ları varsa, herhangi bir olay işleyici verileri değiştirebilir, bu da beklenmedik davranışlara yol açabilir.
    • Özel setter'lar kullanmak ve özellikleri yapıcı (constructor) aracılığıyla başlatmak, olay verilerinin tutarlı kalmasını sağlar.
  2. Sorunun Örneği:

    • Tim, bir olay işleyicinin olay verilerini değiştirmesinin, özellikler salt okunur değilse diğer işleyicileri nasıl etkileyebileceğini gösterir.
    private void CheckingAccount_OverdraftEvent(object sender, OverdraftEventArgs e)
    {
       e.AmountOverdrafted = 1000; // This modification affects all handlers
    }
    private void CheckingAccount_OverdraftEvent(object sender, OverdraftEventArgs e)
    {
       e.AmountOverdrafted = 1000; // This modification affects all handlers
    }
  3. Çözüm:

    • Özel setter kullanın ve verileri yapıcıdan geçirerek özellikleri salt okunur hale getirin.
    public decimal AmountOverdrafted { get; private set; }
    public string MoreInfo { get; private set; }
    public decimal AmountOverdrafted { get; private set; }
    public string MoreInfo { get; private set; }

Kamu Set Kullanılacak Zaman İstisnası (59:29)

Tim Corey, olay veri özellikleri için özel setter kullanma kuralına dikkate alınması gereken önemli bir istisnaya dikkat çeker. Bu istisna, olay dinleyicilerin olay verilerini değiştirmenize izin vermeniz gereken durumlar için geçerlidir, örneğin bir işlemin belirli koşullara bağlı olarak iptal edilebileceği durumlarda.

Örnek: Bir İşlemi İptal Etme

Tim, bir olay işleyicinin işlemi iptal etmesi gereken bir örnek verir. Bu, özel EventArgs sınıfına İptalTransaction özelliği ekleyerek gerçekleştirilir.

  1. Özelliği Tanımlama:

    • EventArgs sınıfına hem alıcı (getter) hem de verici (setter) içeren genel bir özellik ekleyin.
    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 : 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;
       }
    }
  2. Özelliği Olay İşleyicide Ayarlama:

    • Kontrol panelinde (dashboard), olay işleyici bu özelliği işlemi iptal etmek için ayarlayabilir.
    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 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;
    }
  3. Kaynak Metotta Özelliği Kontrol Etme:

    • Olayı tetikleyen metotda, işlemden önce İptalTransaction özelliğinin doğru (true) olarak ayarlanıp ayarlanmamış olduğunu kontrol edin.
    if (args.CancelTransaction)
    {
       return false; // Transaction is canceled
    }
    if (args.CancelTransaction)
    {
       return false; // Transaction is canceled
    }

Uygulama Daha Etkileşimli Hale Getirme

Tim, uygulamayı daha etkileşimli ve kullanıcı dostu hale getirmek için daha da rafine eder.

  1. Fazla Çekiş Kontrolü için Bir Onay Kutusu Ekleme:

    • Kullanıcının fazla çekiş korumasını etkinleştirmesine veya devre dışı bırakmasına olanak tanıyan bir onay kutusu formuna 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 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);
    }
  2. Onay Kutusu Durumunu Yönetme:

    • Onay kutusu için olay işleyicide, bir işlemi iptal etmeye karar verirken onay kutusu 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 void denyOverdraft_CheckedChanged(object sender, EventArgs e)
    {
       if (denyOverdraft.Checked)
       {
           // Logic to stop overdraft transactions
       }
    }
  3. Olay İşleyiciyi Güncelleme:

    • Olay işleyicisinin onay kutusu durumunu dikkate aldığından emin olarak fazla çekişe izin verilmesini veya reddedilmesini 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 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;
    }

Özet

Tim Corey, C#'ta olaylarla çalışma konusunda kilit noktaları ve en iyi uygulamaları özetleyerek eğitimi tamamlar.

  1. Olay Dinleyicilerini Kaldırma:

    • Nesneleri yok etmeden önce her zaman olay dinleyicilerini kaldırın, böylece bellek sızıntılarını önlersiniz.
    • Olay aboneliğinden çıkmak için -= operatörünü kullanın.
    customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;
    customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;
  2. Kullan EventArgs Kalıtımı:

    • Zorunlu olmasa da, EventArgs'ten türemek tutarlılık ve EventArgs.Empty gibi yerleşik özellikleri kullanmak açısından faydalı olabilir.
  3. Sadece Okunur Özellikler için Özel Setterler:

    • Beklenmedik veri değişikliklerini önlemek için özel setterlar kullanın. Yalnızca gerekliyse, örneğin iptal edilebilir işlemler gibi, genel setterlar kullanmaya izin verin.
  4. Olay İşleyici Sözdizimi:

    • Olayları tanımlamak için EventHandler delege'ini kullanın, böylece olay verilerini aktarırken net ve tutarlı bir model sağlarsınız.
  5. Null-Conditional Operator:

    • Null referans istisnaları (exception) riski olmadan olayları güvenli bir şekilde çağırmak için null-conditional operator (?.Invoke()) kullanın.

Sonuç

Tim Corey'nin C# olayları konusunda kapsamlı eğitimi, olayları oluşturma, yönetme ve etkili bir şekilde işleme konularında değerli içgörüler ve pratik örnekler sunar. Bu en iyi uygulamaları takip ederek, geliştiriciler daha etkileşimli ve tepki veren uygulamalar oluşturabilirler.

Hero Worlddot related to C# Olayını Anlamak
Hero Affiliate related to C# Olayını Anlamak

Sevdiğiniz Şeyleri Paylaşarak Daha Fazla Kazanın

.NET, C#, Java, Python veya Node.js üzerinde çalışan geliştiriciler için içerik oluşturuyor musunuz? Uzmanlığınızı ek gelire dönüştürün!

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara