2012-05-22 15 views
5

क्या इन दो कार्यान्वयनों के बीच कोई अंतर है?दो निपटान कार्यान्वयन के बीच अंतर?

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

इसका लंबा और छोटा कोड कोड का दूसरा टुकड़ा सही और सुरक्षित है (भले ही कोई हैंडलर पंजीकृत न हो)।

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


एक मामूली पुनर्रचना की

मैं निम्नलिखित करने के लिए 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

मार्क्स देखें [उत्तर] (http://stackoverflow.com/a/714126/95573) – SwDevMan81

+0

@ SwDevMan81 बिंगो! मैं उस जानकारी की तलाश में हूं, टा। –

+0

@ SwDevMan81: आज मैंने सीखा। (इसके अलावा, यह मार्क है, मार्क नहीं।) – BoltClock

संबंधित मुद्दे