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

Diğer Kategoriler

C# Olayını Anlamak

[[academy-video-youtube({"vid": "-1cftB9q1kQ", "start_time": "0", "title": "Understanding C# Event", "creator": "Tim Corey", "length": "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.

Olaylara Giriş

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.

Demo Uygulama Gezintisi

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.

  1. Uygulama Genel Bakışı:

    • Uygulama, hesap bakiyelerini ve işlemleri görüntülemek için bir forma ve yeni işlemleri kaydetmek için başka bir forma sahiptir.
    • Kredi kartı satın alımlarını simüle etmek ve tasarruflardan çeklere fon aktarmak suretiyle aşım durumlarını ele alan düğmeler içerir.
  2. Ana Form:

    • Müşteri adı, çek ve tasarruf hesap bakiyelerini gösterir.
    • Her iki hesap için işlem listelerini gösterir.
    • İşlem kayıt formunu açmak için bir düğme içerir.
  3. İşlem Formu:

    • Kullanıcının işlem tutarlarını girmesine izin verir.
    • Satın alma işlemlerini simüle eder ve eksiklikleri kapatmak için tasarruftan çek'e fon transferini yönetir.

Demo Uygulamanın Arkasındaki Kod

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

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

    • Müşterinin adı ve iki hesabı (çek ve tasarruf) için özellikler içeren bir müşteri 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ı:

    • Bir banka hesabının detaylarını yönetir, hesap adı, bakiye ve işlem listesi dahil.
    • Bakiye özelliği, hassas parasal hesaplamalar için ondalık türündedir.
    • İşlemler özelliği, dış müdahale edilebilirliği önlemek için salt okunur bir listedir.
  3. Mevduat ve Ödeme İşlemi:

    • Mevduat Ekle Yöntemi: Hesaba mevduat ekler, bakiyeyi günceller ve işlemi kaydeder.
    • Ödeme Yap Yöntemi: Yeterli fon olup olmadığını kontrol etmeyi ve yedek bir hesaptan gerekli fonları aktararak eksiklik korumasını yönetmeyi içeren para çekimlerini ele alır.
  4. Eksiklik Koruması:

    • Uygulama, eksiklikleri ele almak için bir mantık içerir. Bir işlem için çek hesabı bakiyesi yetersiz olduğunda, uygulama tasarruf hesabını kontrol eder. Birleşik bakiye yeterliyse, gerekli miktarı çek hesabına aktarır ve işlemi tamamlar.

Kod örnekleri için, Tim Corey'nin 3:18 ile 18:27 arası kodu açıkladığı videoya direkt olarak başvurabilirsiniz.

Olay: Düğme Tıklama

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ı.

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

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.

  1. Olay İşleyici Yöntemi:

    • Bu yöntem düğmeye her tıklandığında çağrılır. Düğme tıklamasına yanıt olarak çalıştırılması gereken kodu burada yerleştirirsiniz.
    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ğlamak:

    • Olay işleyici yöntemi formun tasarımcı dosyasında (FormName.Designer.cs) düğme tıklama olayına bağlanır. Bu, düğmenin tıklama olayına olay işleyicisini 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ızı, olayların tetikleneceği Hesap sınıfından başlayarak açıklar.

  1. Olay Tanımlama:

    • Olay, event anahtar kelimesi kullanılarak tanımlanır. Olaylar için özel olarak bir genel değişken gibi görünür.
    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 string).
    private void OnTransactionApproved(string transactionName)
    {
       RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
    }
    private void OnTransactionApproved(string transactionName)
    {
       RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
    }
  3. Olayları Bağlama ve İşleme:

    • += operatörünü kullanarak olaya abone olun ve olay yükseltildiğinde olayı işlemek 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'i Güncellemek için Olayları Kullanma

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.

  1. Olayları Yükseltme:

    • 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. Olayları UI'da İmzalama:

    • Ana formda olaylara abone olun ve her yeni işlem onaylandığında işlem listesini güncelleyin.
    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#'ta olayları yükseltirken ?.Invoke() sözdizimini açıklıyor. Bu modern yaklaşım kodu basitleştirir ve iplik güvenliği sağlar.

Soru İşareti Operatörü

Invoke'dan önceki soru işareti (?.) null-şartlı bir operatördür. Olay işleyicisinin null olup olmadığını kontrol eder, potansiyel hataları önler.

  1. Geleneksel Yaklaşım:

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

    • Null-şartlı operatör, bu işlemi sadeleştirir, null kontrolü ve olayı tetiklemeyi tek bir satırda gerçekleştirir.
    RaiseTransactionApprovedEvent?.Invoke(this, depositName);
    RaiseTransactionApprovedEvent?.Invoke(this, depositName);
    • RaiseTransactionApprovedEvent null ise, çağrı gerçekleşmez, bu da herhangi bir istisnadan kaçınmaya etkili bir şekilde olanak sağlar.
  3. Faydalar:

    • Kodu Basitleştirir: Olayları güvenli bir şekilde çağırmak için gereken kod miktarını azaltır.
    • İplik Güvenliği: Null kontrolü ve olayı tek bir adımda tetikleyerek yarış durumlarını ortadan kaldırır.

Olayı Dinleme ve Kod Yazma

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.

  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:

    • Olaya yanıt vermek için bir yöntem tanımlayın. Bu yöntem, olay verilerine göre 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ın İşleyişi ve Tekrarı

Tim, özel olayları oluşturma, yükseltme ve işleme sürecinin tamamını harekete geçirme aşamasında gösteriyor.

  1. Olayı Tetikleme:

    • Bir işlem onaylandıktan 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. Birden Fazla Olayı İşleme:

    • Uygulamanın, işlemler ve bakiye değişiklikleri gibi birden fazla olayı dinlemesini sağlayın, böylece kullanıcı arayüzü gerçek zamanlı olarak güncellenir.
    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, kullanıcı arayüzünün işlemler tarafından tetiklenen olaylara dayanarak otomatik olarak nasıl güncellendiğini göstermek için uygulamayı çalıştırır.

Etkinlik Argüman Bilgisi: Hata Ayıklama

Tim, olayları nasıl hata ayıklayacağınızı ve onlarla gönderilen bilgileri nasıl inceleyeceğinizi gösterir.

  1. Bir Kesme Noktası Ayarlama:

    • Olay verilerini incelemek için olay işleyici yönteminde 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 bir işlemi gerçekleştirin, olayı tetikleyin. Olay argümanlarını hata ayıklayıcıda inceleyin.
    • Gönderen parametresi olayı yükselten örneği ve e parametresi olay verilerini içerir.

Başka Bir Özel Olay Yaratma (Eksiklik Olayı)

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.

Eksiklik Olayını Tanımlama

Tim, Hesap sınıfında eksiklik senaryoları için yeni bir olay tanımlayarak başlıyor:

  1. Olay Beyanı:

    • Eksiklik miktarını geçmek için ondalık bir türle event anahtar kelimesi kullanarak olayı tanımlayın.
    public event EventHandler<decimal> OverdraftEvent;
    public event EventHandler<decimal> OverdraftEvent;
  2. Olayı Tetikleme:

    • Olay, bir eksikliğin başarıyla gerçekleştiği kodun bir bölümünde tetiklenir.
    if (overdraftSuccessful)
    {
       OverdraftEvent?.Invoke(this, overdraftAmount);
    }
    if (overdraftSuccessful)
    {
       OverdraftEvent?.Invoke(this, overdraftAmount);
    }

Eksiklik Olayına Gösterge Tarafında Abone Olma

  1. Olayı Bağlamak:

    • Gösterge formunda eksiklik olayına abone olun.
    customer.CheckingAccount.OverdraftEvent += CheckingAccount_OverdraftEvent;
    customer.CheckingAccount.OverdraftEvent += CheckingAccount_OverdraftEvent;
  2. Olayı İşleme:

    • Bir eksiklik meydana geldiğinde bir mesaj görüntülemek için bir olay işleyici 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:

    • Bir eksiklik meydana geldiğinde, olay tetiklenir ve kullanıcıyı bilgilendirmek için kullanıcı arayüzünü günceller.
    You had an overdraft protection transfer of $20.44

Olayı Birden Fazla Yerde Dinleme

Tim, olayların birden fazla konumda ve formda aynı anda dinlenebildiğini

  1. Başka Bir Forma Etiket Ekleme:

    • Eksiklik mesajlarını görüntülemek için ikincil bir forma bir etiket ekleyin.
    <asp:Label ID="errorMessage" runat="server" Visible="false" />
    <asp:Label ID="errorMessage" runat="server" Visible="false" />
    HTML
  2. Olaylara Abone Olma:

    • İkincil formda eksiklik olayına abone olun.
    customer.CheckingAccount.OverdraftEvent += SecondaryForm_OverdraftEvent;
    customer.CheckingAccount.OverdraftEvent += SecondaryForm_OverdraftEvent;
  3. Olayı İşleme:

    • İkincil formda eksiklik mesajını görüntülemek için bir 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 İşleme:

    • Tim, olayın birden fazla formda eşzamanlı olarak işlenebileceğini, uygulamanın tüm ilgili parçalarının olaya uygun şekilde yanıt vermesini sağlamaktadır.
    Both the main form and the secondary form display the overdraft message when the event is triggered.

Olay Dinleyicilerini Bellekten Kaldırma

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.

  1. Olaylardan Çıkma:

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

    Neden Önemlidir:

    • Olaylardan çıkmamak, olayları dinleyen nesneler uygun şekilde çöp toplama yapılmayabileceğinden hafıza sızıntılarına yol açabilir.
  2. Adlandırılmış Yöntemleri Kullanma:

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

Genel EventHandler: Bir Sınıf T için Geçirme

Tim 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.

Olay Verisi için Neden Bir Sınıf Kullanılmalı

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:

  1. Esneklik ve Ölçeklenebilirlik:

    • Bir sınıf kullanarak, bir olay üzerinden birden fazla ilgili veri parçası geçirebilirsiniz. Daha sonra daha fazla veri eklemeniz gerekirse, sınıfı genişletebilir ve olayın imzasını değiştirmeden yapabilirsiniz.
  2. EventArgs Mirası:

    • Eskiden, bir olaydan geçirilen herhangi bir nesne EventArgs'tan türemek zorundaydı, bu artık gerekli değil. Ancak, tutarlılık ve açıklık için EventArgs'tan türetmek hala faydalı olabilir.

Eksiklik EventArgs Sınıfını Oluşturma

Tim, eksiklik olayı için özel bir EventArgs sınıfı nasıl oluşturulacağını gösterir.

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

    • EventArgs'tan türeyen ve olay üzerinden geçmek 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. Sınıfı Olayda Kullanma:

    • Olayın 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ı çağırırken özel EventArgs sınıfının bir örneğini geçirin.
    OverdraftEvent?.Invoke(this, new OverdraftEventArgs(amountNeeded, "Additional info"));
    OverdraftEvent?.Invoke(this, new OverdraftEventArgs(amountNeeded, "Additional info"));

Salt Okunur Özelliklerin Önemi

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

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

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

    • Tim, özellikler salt okunur olmadığında bir olay işleyicide olay verilerini değiştirmenin diğer işlemleri nasıl etkileyebileceğini demolar.
    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:

    • Özellikleri salt okunur yapmak için özel ayarlayıcılar kullanın ve verileri yapılandırıcı aracılığıyla iletin.
    public decimal AmountOverdrafted { get; private set; }
    public string MoreInfo { get; private set; }
    public decimal AmountOverdrafted { get; private set; }
    public string MoreInfo { get; private set; }

Özel Set Kullanma İstisnası (59:29)

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.

Örnek: İşlem İptali

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.

  1. Özelliği Tanımlamak:

    • EventArgs sınıfına hem getter hem de setter ile bir genel ö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 İşleyiciye Ayarlamak:

    • Gösterge tablosunda, olay işleyici bu özelliği belirleyip işlemi iptal edebilir.
    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. 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
    }
    if (args.CancelTransaction)
    {
       return false; // Transaction is canceled
    }

Uygulamanın Daha Etkileşimli Hale Getirilmesi

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

  1. Aşırı Çekim Kontrolü için Onay Kutusu Ekleme:
  • 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 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);
    }
  1. Onay Kutusunun Durumunu Yönetme:
  • 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
       }
    }
    private void denyOverdraft_CheckedChanged(object sender, EventArgs e)
    {
       if (denyOverdraft.Checked)
       {
           // Logic to stop overdraft transactions
       }
    }
  1. Olay İşleyiciyi Güncelleme:
  • 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;
    }
    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# ile olaylarla çalışırken dikkate alınması gereken önemli noktaları ve en iyi uygulamaları özetleyerek öğreticiyi tamamlar.

  1. Olay Dinleyicilerini Kaldırma:
  • 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;
    customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;
  1. EventArgs Kalıtımını Kullanma:
  • Zorunlu olmamakla birlikte, EventArgs'ten türetmek, tutarlılık ve EventArgs.Empty gibi yerleşik özelliklerin kullanımı için faydalı olabilir.
  1. Salt Okunur Özellikler için Özel Ayarlayıcılar:
  • Olay verilerinde istenmeyen değişiklikleri önlemek için özel ayarlayıcılar kullanın. Sadece iptal edilebilir işlemler gibi gerekli durumlarda genel ayarlayıcılara izin verin.
  1. Olay İşleyici Sözdizimi:
  • Olayları tanımlamak için EventHandler delegesini kullanın, bu, olay verilerini iletmek için net ve tutarlı bir desen sağlar.
  1. Null-Koşullu Operatör:
  • Null referans istisnaları riskini almadan, olayları güvenli bir şekilde çağırmak için null-koşullu operatörü (?.Invoke()) kullanın.

Sonuç

Tim 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.

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 ile çalışan geliştiriciler için içerik oluşturuyor musunuz? Uzmanlığınızı ek gelire dönüştürün!

Iron Destek Ekibi

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