0Pricing
C# Academy · Ders

Olay kalıpları ve tuzaklar (bellek sızıntıları)

Olaylardaki tuzakları fark edip düzeltin: bellek sızıntılarını önlemek için abonelikten çıkın, kaldırabilmek için delegate başvurularını saklayın ve IDisposable abonelik kalıbını kullanın.

Olay kalıpları ve tuzaklar (bellek sızıntıları), CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 3 dersten oluşur.

Tuzaklara genel bakış

Amaç: Olayları güvenli biçimde kullanmak.

  • leaks oluşmasını önlemek için abonelikten çıkın.
  • Kaldırabilmek için aynı işleyiciye ait başvuruyu saklayın.
  • Temizleme için küçük bir IDisposable desenini tercih edin.
  • Ayrılamadığınız satır içi anonim işleyicilerden kaçının.

Sızıntıları önlemek için abonelikten çıkma

Olaylar abonelere ait başvuruları tutar. Yayımcı uzun süre yaşarsa ve abonelikten hiç çıkmazsanız abone bellekten toplanamaz.

using System;

public class Publisher
{
  public event EventHandler Tick;
  public void Fire()
  {
    EventHandler h = Tick;
    if (h != null) h(this, EventArgs.Empty);
  }
}

public class Subscriber
{
  public void Handle(object s, EventArgs e)
  {
    Console.WriteLine("Handling tick");
  }

  public void Subscribe(Publisher p) { p.Tick += Handle; }
  public void Unsubscribe(Publisher p) { p.Tick -= Handle; } // required to avoid leaks
}

public class Program
{
  public static void Main(string[] args)
  {
    Publisher p = new Publisher();
    Subscriber s = new Subscriber();

    s.Subscribe(p);
    p.Fire();                // prints once

    s.Unsubscribe(p);        // detach when done
    s = null;                // now eligible for GC in a real app
    p.Fire();                // no output
  }
}

İşleyici başvurusunu saklama

Anonim bir işleyiciden ayrılmak için onu bir değişkende saklayın ve -= işlemine aynı örneği geçirin.

using System;

public class Button
{
  public event EventHandler Click;
  public void Simulate()
  {
    EventHandler h = Click;
    if (h != null) h(this, EventArgs.Empty);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Button b = new Button();

    // BAD: cannot easily remove this later
    // b.Click += (s, e) => Console.WriteLine("inline");

    // GOOD: store the handler, attach, later detach the same instance
    EventHandler saved = (s, e) => Console.WriteLine("saved");
    b.Click += saved;

    b.Simulate();           // prints "saved"
    b.Click -= saved;       // can remove because we kept the reference
    b.Simulate();           // no output
  }
}

Temizlenebilir abonelik

Subscribe işleminden bir IDisposable döndürün. Abonelikten otomatik olarak çıkmak için using kullanın.

using System;

public class Ticker
{
  public event EventHandler Tick;

  public IDisposable Subscribe(EventHandler handler)
  {
    Tick += handler;
    return new Unsubscriber(this, handler);
  }

  private sealed class Unsubscriber : IDisposable
  {
    private Ticker _t;
    private EventHandler _h;
    private bool _done;

    public Unsubscriber(Ticker t, EventHandler h) { _t = t; _h = h; }

    public void Dispose()
    {
      if (!_done)
      {
        _t.Tick -= _h;
        _done = true;
      }
    }
  }

  public void Fire()
  {
    EventHandler h = Tick;
    if (h != null) h(this, EventArgs.Empty);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Ticker t = new Ticker();
    using (t.Subscribe((s, e) => Console.WriteLine("tick")))
    {
      t.Fire(); // prints once
    }
    t.Fire();   // nothing after disposal
  }
}

try/finally ile ayrılma

Bir özel durum oluşsa bile işleyicinin ayrılması gerekiyorsa try/finally kullanın.

using System;

public class Alarm
{
  public event EventHandler Ring;
  public void Trigger()
  {
    EventHandler h = Ring;
    if (h != null) h(this, EventArgs.Empty);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Alarm a = new Alarm();
    EventHandler h = (s, e) => Console.WriteLine("ring");

    a.Ring += h;
    try
    {
      a.Trigger(); // do work with subscription active
    }
    finally
    {
      a.Ring -= h; // always detach
    }

    a.Trigger(); // no output
  }
}

Sızıntıları önleme ipuçları

İpuçları:

  • Aboneler abonelikten çıkma işleminin sorumluluğunu üstlenmelidir (Dispose, finally veya açık bir yöntem kullanarak).
  • Kaldıramayacağınız satır içi anonim işleyicilerle abone olmaktan kaçının.
  • Statik olaylara dikkat edin; bunlar genellikle nesnelerden daha uzun yaşar.
  • İşleyicileri kısa tutun; yayımcıyı engellemeyin.

Olaylarda sızıntı nedeni

Hızlı kontrol: C# olaylarını kullanırken bellek leaks oluşmasının yaygın bir nedeni nedir?

Tekrar

Tekrar: leaks oluşmasını önlemek için abonelikten çıkın, kaldırabilmek için işleyici başvurularını saklayın ve güvenli olay yaşam süreleri için temizleme işlemlerinde temizlenebilir veya finally tabanlı desenleri tercih edin.

Sıkça Sorulan Sorular

“Olay kalıpları ve tuzaklar (bellek sızıntıları)” dersi ücretsiz mi?

Evet — “Olay kalıpları ve tuzaklar (bellek sızıntıları)” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 3 dersten oluşur.

“Olay kalıpları ve tuzaklar (bellek sızıntıları)” dersinde ne öğreneceğim?

Olaylardaki tuzakları fark edip düzeltin: bellek sızıntılarını önlemek için abonelikten çıkın, kaldırabilmek için delegate başvurularını saklayın ve IDisposable abonelik kalıbını kullanın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 3. dersidir.

“Olay kalıpları ve tuzaklar (bellek sızıntıları)” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. delegate, Action/Func, kapanışlar
  2. Olaylar: yayımlama/abone olma, event anahtar sözcüğü
  3. Olay kalıpları ve tuzaklar (bellek sızıntıları)
← C# Academy Sayfasına Dön