SORU
23 EKİM 2008, PERŞEMBE


C yükselterek# uzatma yöntemi - çok mu kötü?ile olaylar

C o korku hepimizin aşina# olay bildirimi. İş parçacığı güvenliği, the standard is to write something like this sağlamak için:

public event EventHandler SomethingHappened;
protected virtual void OnSomethingHappened(EventArgs e)
{            
    var handler = SomethingHappened;
    if (handler != null)
        handler(this, e);
}

Bu kurul şimdi bulamıyorum) başka soru son zamanlarda, biri uzatma yöntemleri güzel bu senaryoda kullanılabilir dikkat çekti. Bunu yapmanın bir yolu:

static public class EventExtensions
{
    static public void RaiseEvent(this EventHandler @event, object sender, EventArgs e)
    {
        var handler = @event;
        if (handler != null)
            handler(sender, e);
    }
    static public void RaiseEvent<T>(this EventHandler<T> @event, object sender, T e)
        where T : EventArgs
    {
        var handler = @event;
        if (handler != null)
            handler(sender, e);
    }
}

Bu uzatma yöntemleri ile, ilan ve bir olayı başlatmak için ihtiyacınız olan tek şey bu gibi bir şey:

public event EventHandler SomethingHappened;

void SomeMethod()
{
    this.SomethingHappened.RaiseEvent(this, EventArgs.Empty);
}

Sorum şu: bu iyi bir fikir mi? Standart yöntem olmaması bir şey mi eksik? (Fark ettiğim bir şey kod Ekle/Kaldır açık olan olaylar ile çalışmıyor.)

CEVAP
23 EKİM 2008, PERŞEMBE


Hala açık bir Ekle/Kaldır olayları ile çalışacak - sadece olay adı yerine temsilci değişken (veya ancak temsilci depoladığınız) kullanmanız gerekir.

Ancak, güvenli iplik-yapmak - yok-op işleyicisi ile başlatmak için daha kolay bir yolu var:

public event EventHandler SomethingHappened = delegate {};

Performans ekstra bir temsilci çağırma hit önemsiz olacak, ve emin olun bu daha kolay kod yapar.

Uzantısı yöntemi bu arada, sadece yapabilirsin ek olarak yerel bir değişken olman gerekmiyor:

static public void RaiseEvent(this EventHandler @event, object sender, EventArgs e)
{
    if (@event != null)
        @event(sender, e);
}

static public void RaiseEvent<T>(this EventHandler<T> @event, object sender, T e)
    where T : EventArgs
{
    if (@event != null)
        @event(sender, e);
}

Şahsen parametre adı olarak bir kelime, ama gerçekten yani nasıl istiyorsan öyle yap çağıran tarafı değiştirmiyor.:) kullanmazdım

EDİT: "" yöntem: sizin sınıftan türetilmiş olmayı planlıyorsun? OnXXX gelince Benim görüşüme göre, en sınıfları kapatılmış olmalıdır. Eğeryapın, bu türetilmiş sınıfları bu olay yükseltmek mümkün olmak ister misin? Eğer bu sorulardan birine cevap "hayır" o zaman rahatsız olmayın. "Evet" sonra yapın :) . hem cevabı ise

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Michelle Phan

    Michelle Pha

    18 Temmuz 2006
  • Smith Micro Graphics

    Smith Micro

    15 Mayıs 2008
  • wowchick16

    wowchick16

    17 Mart 2007