2012-05-22 29 views
5

Bu iki uygulama arasında bir fark var mı?İki imha uygulamaları arasındaki fark?

1:

public class SMSManager : ManagerBase 
{ 
    private EventHandler<SheetButtonClickEventArgs> _buttonClickevent; 

    public SMSManager(DataBlock smsDataBlock, DataBlock telephonesDataBlock) : 
     base(smsDataBlock) 
    { 
     _buttonClickevent = new EventHandler<SheetButtonClickEventArgs>(OnButtonClick); 
     SheetEvents.ButtonClick += _buttonClickevent; 

    } 

    public override void Dispose() 
    { 
     base.Dispose(); 
     if (_buttonClickevent != null) 
     SheetEvents.ButtonClick -= _buttonClickevent; 
    } 
} 

2:

public class SMSManager : ManagerBase 
{ 
    public SMSManager(DataBlock smsDataBlock, DataBlock telephonesDataBlock) : 
     base(smsDataBlock) 
    { 
     SheetEvents.ButtonClick += new EventHandler<SheetButtonClickEventArgs>(OnButtonClick); 
    } 

    public override void Dispose() 
    { 
     base.Dispose(); 
     SheetEvents.ButtonClick -= new EventHandler<SheetButtonClickEventArgs>(OnButtonClick); 
    } 
} 

ilk bellek sızıntıları açısından saniyeden daha doğru görünmektedir. Ama gerçekten doğru mu?

+0

Yanıt olarak bir cevabı işaretlemeyi unutmayın, bu sitenin içeriğini zenginleştirmeye yardımcı olur. –

cevap

5

Uzun ve kısa kodun ikinci kısmı doğru ve güvenlidir (kayıtlı hiçbir işleyici olmasa bile).

namespace ConsoleApplication61 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var f = new Foo(); 
      f.MyEvent += new EventHandler(Handler); 
      f.Trigger(); 
      f.MyEvent -= new EventHandler(Handler); 
      f.Trigger(); 
      Console.Read(); 
     } 

     static void Handler(object sender, EventArgs e) 
     { 
      Console.WriteLine("handled"); 
     } 
    } 

    class Foo 
    { 
     public event EventHandler MyEvent; 
     public void Trigger() 
     { 
      if (MyEvent != null) 
       MyEvent(null, null); 
     } 
    } 
} 

Bu örnek baskılar zamanlar "ele":

bu örnek uygulamayı düşünün. Örneğin, örneğinizde, bunlar işlevsel olarak aynıdır ve her ikisi de gerektiği gibi çalışacaktır. Eklenmeyen bir işleyiciyi kaldırmak da güvenli bir işlemdir, basitçe hiçbir şeyleri kaldıramaz ve hiçbir şey yapmaz. Yorum olarak sağlanan gibi

, Marc'ın cevabı daha ayrıntılı anlatır: Anonim Yöntemleri ile

Unregister events with new instance of the delegate


Olay işleyicileri

O halde bu olay işleyicileri dikkati çekiyor lambda ifadelerinin, örnek ve yöntem imzasına dayalı benzersizliği garantilemesi garanti edilmez. anonim bir yöntem çıkmak için gerekiyorsa, bir yönteme bunu teşvik eden veya daha sonra kullanılmak üzere anonim yöntemine bir başvuru tutmak için gereken ya: Bu yanıtlayan

Func<object, EventArgs> meth = (s, e) => DoSomething(); 

myEvent += meth; 
myEvent -= meth; 

Jon Skeet ayrıntılı anlatır ve büyük olasılıkla daha iyi bir iş yapar o daha beni :-)

How to remove a lambda event handler


bir hafif Refactoring ait

Aşağıdakilere göre refactor:

public class SMSManager : ManagerBase 
{ 
    public SMSManager(DataBlock smsDataBlock, DataBlock telephonesDataBlock) 
     : base(smsDataBlock) 
    { 
     SheetEvents.ButtonClick += OnButtonClick; 
    } 

    public override void Dispose() 
    { 
     SheetEvents.ButtonClick -= OnButtonClick; 
     base.Dispose(); 
    } 
} 
+0

Bkz Marcs [answer] (http://stackoverflow.com/a/714126/95573) – SwDevMan81

+0

@ SwDevMan81 Bingo! Bu bilgiyi arıyorum, ta. –

+0

@ SwDevMan81: Bugün öğrendim. (Ayrıca, Mark, Mark değil.) – BoltClock