2012-05-22 6 views
5

これら2つの実装に違いはありますか?2つの実装の違いは?

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); 
    } 
} 

最初のものは、メモリリークに関しては第二より正確であると思われます。しかし、それは本当に正しいですか?

+0

答えとしてマークするのを忘れないでください。この答えはこのサイトの内容を充実させるのに役立ちます。 –

答えて

5

2番目のコードは、(ハンドラが登録されていない場合でも)正確で安全です。かつて "扱い"

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); 
     } 
    } 
} 

このサンプルプリント:

は、このサンプル・アプリケーションを考えてみましょう。

あなたの例では、機能的には同じで、両方とも必要に応じて動作します。追加されていないハンドラを削除することも安全なアクションです。削除するものは何も見つからず、何もしません。コメントで提供されるように

は、マルクの答えは、より多くの詳細に立ち入り:匿名メソッドと

Unregister events with new instance of the delegate


イベントハンドラ

それは形でそのイベントハンドラを注目する価値がありますラムダ式のインスタンスとメソッドのシグネチャに基づいて一意性を保証するものではありません。匿名メソッドを解除する必要がある場合は、どちらかの方法にそれを促進するか、または後で使用するために匿名メソッドへの参照を保持する必要があります。

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

myEvent += meth; 
myEvent -= meth; 

ジョンスキートはこれに答えるディテールに入り、おそらくより良い仕事をしていませんそれよりも私:-)

How to remove a lambda event handler


わずかなリファクタリングの

私は次のようにリファクタリングします:

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

Marcsを参照してください[回答](http://stackoverflow.com/a/714126/95573) – SwDevMan81

+0

@ SwDevMan81ビンゴ!私はその情報を探していました。 –

+0

@ SwDevMan81:今日私は学んだ。 (またマークではなくマークです) – BoltClock