2012-01-09 13 views
5

जब आप एक फ़ॉर्म या एक उपयोगकर्ता नियंत्रण बनाने के लिए, WinForms डिजाइनर एक निपटाने विधि है कि इस तरह दिखता है उत्पन्न करता है:WinForms डिजाइनर अपनी निपटान विधि में कुछ हद तक 'असुविधाजनक' कोड क्यों उत्पन्न करता है?

protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

इस कोड के साथ समस्या अगर यह कभी करने के लिए संपादित किया जाता है कि यह गलत व्यवहार हो सकता है है अतिरिक्त वस्तुओं का निपटान। मैं निपटाने तरीकों कि इस तरह दिखना साथ .designer.cs फ़ाइलों को देखा है:

protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
      if (_myDisposable != null) 
       _myDisposable.Dispose(); 
      if (_myOtherDisposable != null) 
       _myOtherDisposable.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

... जो गलत है, के रूप में _myDisposable और _myOtherDisposable के निपटान किया जाए या नहीं घटकों पर निर्भर नहीं रहना चाहिए रिक्त है।

तो, इस डिजाइनर जेनरेट कोड को संपादित करने के लिए यह अच्छा अभ्यास है या नहीं, इस तथ्य को अनदेखा कर रहा है कि आप टेम्पलेट्स को संपादित करके इसे बदल सकते हैं, मेरा सवाल यह है: डिजाइनर कोड क्यों उत्पन्न नहीं करता है यह इस तरह दिखता है?

protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      if(components != null) 
       components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

इस कोड का एक ही अंत परिणाम है, लेकिन संशोधन के दौरान त्रुटियों के लिए सुरक्षित और कम प्रवण है।

+0

पहला और तीसरा कोड ब्लॉक (लगभग) समान है। या क्या मैं कुछ न कुछ भूल रहा हूं? –

+0

@ एर्नो - आप सही हैं, क्योंकि '&&' शॉर्ट सर्किट होगा। – Oded

+0

तो कोई सवाल नहीं है (चम्मच)? –

उत्तर

4

उत्तर है: क्योंकि आपकी सुविधा माइक्रोसॉफ्ट में इस समारोह को लिखने वालों की प्राथमिक चिंता नहीं थी। या शायद उन्होंने सोचा था कि, एक गैर-माइक्रोसॉफ्ट कर्मचारी होने के नाते, संभवतः प्रोग्रामर के रूप में कोई भी अच्छा नहीं हो सकता है, इसलिए, आपको शायद किसी ऑब्जेक्ट के निपटान() विधि को संशोधित करने जैसे खतरनाक व्यवसायों से दूर रहना चाहिए।

वैसे, निपटान() विधि Designer.cs फ़ाइल के भीतर क्षेत्र के बाहर स्थित है जिसे "इस डिजाइनर जेनरेट कोड को संपादित न करें" के रूप में नामित किया गया है, इसलिए मुझे लगता है कि इसे संपादित करना ठीक है।

1

आप अधिकतर सही हैं, और आपने इस तथ्य का भी उल्लेख नहीं किया कि यह Designer.cs फ़ाइल के अंदर रखा गया है।

आपको इसे पहले (MyForm.cs पर) ले जाना होगा और फिर इसे संपादित करना होगा। कुछ सामान्य ज्ञान के साथ ...

लेकिन यह काफी हद तक अकादमिक है, घटक == शून्य केवल एक पूरी तरह से खाली फॉर्म पर सच होगा। 1 बटन या लेबल ड्रॉप करें और समस्या नहीं आती है।

मैंने अभी एक खाली फॉर्म पर भी चेक किया है, यह null नहीं है। (ठीक है, केवल Fx 4+ के लिए स्पष्ट रूप से)

+0

वीएस 2010 में घटक कभी भी शून्य नहीं लगते हैं, लेकिन वीएस 2008 में और नीचे यह हमेशा शून्य होगा जबतक कि आप विशेष रूप से एक घटक जैसे कि आपके फॉर्म में टाइमर जोड़ते हैं। –

1

फॉर्म पर निहित संसाधनों का निपटान करने के लिए अनुशंसित तरीका फॉर्मक्लोसिंग या फॉर्मक्लोज्ड ईवेंट का उपयोग करना है। UserControl के एक ही उद्देश्य के लिए एक विघटित घटना है।

+0

बंद और बंद दोनों अप्रचलित हैं, FormClosing और .NET 2.0 में FormClosed द्वारा प्रतिस्थापित। आपको उस सिफारिश को कहां मिला? –

+0

@ हंस, मैंने तदनुसार प्रतिक्रिया संपादित की है; मुझे क्लोजिंग/बंद करने के लिए कुछ साल पहले मौखिक रूप से बताया गया था और मैं भूल गया था कि उन्हें वास्तव में फॉर्मक्लोसिंग और फॉर्मक्लोज्ड नाम दिया गया था। मुझे वास्तव में पता नहीं था कि अन्य नामों के साथ अप्रचलित घटनाएं थीं। –

3

मैं तर्क दूंगा कि ऐसा इसलिए है क्योंकि माइक्रोसॉफ्ट के "आधिकारिक" IDisposable पैटर्न बहुत सी स्थितियों को अनावश्यक रूप से समायोजित करने का प्रयास करता है।

अधिक जानकारी के लिए, स्टीफन क्लेरी द्वारा इस उत्कृष्ट लेख को देखें: What your mother never told you about IDisposableIDisposable के साथ मुद्दों में उन्हें कुछ बेहतरीन अंतर्दृष्टि है, और उन्हें कैसे ठीक किया जाए।

स्टीफन एक साधारण दिशानिर्देश प्रदान करता है: केवल एक वर्ग में प्रबंधित और अप्रबंधित संसाधनों को मिश्रण न करें; इसके बजाय, प्रत्येक अप्रबंधित संसाधन को IDisposable कक्षा में लपेटें जिसका एकमात्र उद्देश्य अप्रबंधित संसाधन का निपटान करना है।

यदि कोई इस दिशानिर्देश का पालन करता है, तो इस तरह के आर्केन Dispose विधियों को आवश्यक रूप से रोकना बंद हो जाता है, साथ ही साथ माइक्रोसॉफ्ट के अनुशंसित पैटर्न के साथ अन्य गंभीर मुद्दों को हल करने के साथ-साथ।

+0

+1। फिर भी, IDISposable में उन्हें लपेटने के बाद भी, जब आप उनके साथ किया जाता है, तो स्पष्ट रूप से या 'उपयोग() {} 'के माध्यम से' निपटान() 'का आह्वान करना आवश्यक है। अन्यथा व्यवहार उन्हें बिल्कुल लपेटने से कहीं ज्यादा बेहतर नहीं है। – JMD

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