2012-04-02 3 views
6

में आरएआईआई लागू करना मेरे पास एक इन्फोपाथ फॉर्म है जिसे मुझे सशर्त रूप से ऑनचेंज ईवेंट अक्षम करने की आवश्यकता है। चूंकि फॉर्म लोड होने के बाद ईवेंट हैंडलर को बाध्य करना संभव नहीं है, इसलिए मुझे वैश्विक काउंटर पर भरोसा करना पड़ता है जो इंगित करता है कि ऑनचेंज ईवेंट निष्पादित किया जाना चाहिए या नहीं। प्रत्येक ऑन चेंज ईवेंट के अंदर, मैं जांच करता हूं कि कोई क्रिया करने से पहले SuppressEventsCount == 0। कुछ फ़ंक्शन या किसी अन्य के निष्पादन के दौरान ईवेंट को दबाने के लिए, मैं बस SuppressEventsCount ++ सेट करता हूं, और फिर जब फ़ंक्शन निकलता है। ऐसा करने में सबसे बड़ी समस्या यह है कि यह अपवाद सुरक्षित नहीं है। इसलिए मैं रैप करने के लिए SuppressEvents एक वर्ग जो IDisposableसी #

using(SuppressEvents s = new SuppressEvents()){ 
    // OnChange events fired here are ignored 
} // OnChange events enabled again 

यह काम कर रहा है लागू करता है में मुकाबला उज्जवल विचार था, लेकिन यह अभी भी एक सी ++ समाधान जो "का उपयोग" के उपयोग की आवश्यकता नहीं है के रूप में के रूप में आदर्श नहीं है बिल्कुल निर्देश

  1. उत्प्रेरक एक नाशक या कुछ समारोह पल एक वस्तु क्षेत्र से बाहर चला जाता है, या
  2. रोकें SuppressEvents एक के बाहर initialised होने से आपत्ति निर्देश "का उपयोग":

    वहाँ किसी तरह या तो है पूरी तरह से

+0

यह प्रश्न देखें: http://stackoverflow.com/q/2101524/6345 (क्या यह अपवाद सुरक्षा के लिए "स्कॉप्ड व्यवहार" प्राप्त करने के साधन के रूप में IDISposable और "उपयोग" का उपयोग करने के लिए अपमानजनक है?) –

उत्तर

2

प्रश्न 2 के संबंध में, Aroun प्राप्त करना संभव हो सकता है कोड के उपभोक्ताओं को एक अलग इंटरफ़ेस प्रदान करके इसे डी करें।

public static class EventSuppressor { 
    public void Suppress(Action action) { 
     using (var s = new SuppressActions()) { 
      action(); 
     } 
    } 

    private class SuppressActions : IDisposable { 
     ... 
    } 
} 

फिर उपभोक्ताओं के लिए इसका उपयोग कर सकते हैं: इसके बजाय एक सार्वजनिक वर्ग कि IDisposable लागू करता है प्रदान करने, और उम्मीद है वे एक using में लपेट के, आप एक स्थिर विधि है कि एक "दबा" संदर्भ में निष्पादित करने के लिए एक समारोह लेता है प्रदान कर सकता है इस प्रकार है:

EventSuppressor.Suppress(() => { 
    // OnChange events fired here are ignored 
}) // OnChange events enabled again 
बेशक

, आप यह पता है कि क्या इस डिजाइन उचित है काम करना है, के रूप में इस अतिरिक्त फ़ंक्शन कॉल, संकलक उत्पन्न वर्गों और बंद होने आदि में परिणाम होगा

6

नहीं और नहीं। using निकटतम आप आरएआईआई प्राप्त कर सकते हैं (अधिक सटीक रूप से, हम रिसोर्स रिलीज के बारे में बात कर रहे हैं जो कि आरएआईआई-मुहावरे वस्तु को नष्ट कर रहा है)।

अधिक सीधे अपने अंक का जवाब करने के लिए:

  1. IDisposable (और विस्तार using से) वास्तव में बनाया गया था करने के लिए जो .NET में कोई रास्ता नहीं है क्योंकि वहाँ।
  2. using वाक्यात्मक चीनी के रूप में try/finally संकलित हो जाता है और केवल आवश्यकता है कि वस्तु IDisposable है है, तो आप एक using बयान के अंदर और इससे बाहर के उपयोग के बीच भेद नहीं कर सकते हैं।
0

अपने दो सवालों के जवाब देने के लिए:

  1. नहीं, नहीं है, .NET में कूड़ा संग्रह
  2. नहीं, आप, using खंड एक में अनुवाद किया जाता है नहीं कर सकते हैं प्रकृति में निर्धारित करने योग्य नहीं है कोशिश करें/आखिरकार कोड के प्रकार को अवरुद्ध करें, और किसी भी मामले में आप यह पता नहीं लगा सकते कि यह किसी भी दो संरचनाओं से निर्मित है, बाहरी
0

आप (यदि clr साथ संकलित अभी भी 100% नेट: सुरक्षित) सी # से सेल्सियस तक ++ स्थानांतरित कर सकते हैं, तो नेट।, तो आप msclr :: auto_handle जो सिर्फ इस तरह के auto_ptr आदि के रूप में एक स्मार्ट सूचक की तरह काम करता उपयोग कर सकते हैं ...

आईएल में दृश्य के पीछे वास्तव में क्या करता है यह कोशिश/गलती आदेशों का एक गुच्छा है लेकिन यह डेवलपर और उपयोगकर्ता के लिए पूरी तरह से अदृश्य है। पूरी प्रक्रिया बस आईएमओ बेहतर है।