2010-06-22 19 views
53

मैं सी # के लिए नया हूं, और मैंने पहले की पोस्ट देखने की कोशिश की लेकिन मुझे कोई अच्छा जवाब नहीं मिला।सी # फॉर्म। बंद बनाम फॉर्म।

एक सी # विंडोज फॉर्म एप्लिकेशन में एक ही फॉर्म के साथ, Form.Close() बेहतर या Form.Dispose() का उपयोग कर रहा है?

एमएसडीएन का कहना है कि वस्तु के भीतर सभी संसाधन बंद हैं और बंद होने पर फॉर्म का निपटारा किया जाता है। जिसके बावजूद, मैं कई उदाहरणों में ऑनलाइन आया हूं जो बंद होने की बजाय निपटान का पालन करते हैं।

क्या किसी के पास दूसरे का लाभ है? किस परिदृश्य के तहत हम एक दूसरे को पसंद करते हैं?

+0

थोड़ा अलग सवाल है, एक ही जवाब है, IMO: सिवाय इसके कि आप बंद एक बार से अधिक कॉल कर सकते हैं अर्थात बंद और निपटान, आम तौर पर बराबर हैं। – ChrisW

+2

@ क्रिसिस: आप एक से अधिक बार निपटान भी कर सकते हैं। –

+0

@ChrisW, निपटान को एक से अधिक बार चलाने के लिए डिज़ाइन किया जाना चाहिए। http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae –

उत्तर

117

This एमएसडीएन पर मंच आपको बताता है।

Form.Close() Win32 खिड़की बंद करने के लिए उचित विंडोज संदेश भेजता है। उस प्रक्रिया के दौरान, यदि फ़ॉर्म को सामान्य रूप से नहीं दिखाया गया था, तो फॉर्म पर कॉल किया गया है। फॉर्म का निपटान अप्रबंधित संसाधनों को मुक्त करता है जो फ़ॉर्म पर हो रहा है।

यदि आप करते हैं एक form1.Show() या Application.Run(new Form1()), निपटान जब Close() कहा जाता है बुलाया जाएगा।

हालांकि, अगर आप form1.ShowDialog() रूप रुप से दिखाने के लिए करते हैं, प्रपत्र निपटारा नहीं किया जाएगा, और आप की आवश्यकता होगी form1.Dispose() खुद के कॉल करने के लिए। मैं मानता हूं कि यह एकमात्र समय है जब आप को फॉर्म फ़ॉर्म का निपटान करने के बारे में चिंता करनी चाहिए।

+0

यह क्यों मतदान किया गया था? –

+0

क्या पहले संस्करण में उद्धरण शामिल था? क्षतिपूर्ति करने के लिए +1। –

+0

@ पहले संस्करण को चूसना ... (क्षमा करें @Kyra) – jjnguy

5

कॉल नहीं Close शायद Win32 संदेशों जो एक लगता होगा कुछ हद तक महत्वपूर्ण हालांकि मैं विशेष रूप से आपको नहीं बता क्यों कर सकते हैं का एक समूह भेजने नजरअंदाज ...

Close घटनाओं को ऊपर उठाने को लाभ मिलता है (जो कर सकते हैं रद्द कर दिया जाए) जैसे कि बाहरी व्यक्ति (फॉर्म में) FormClosing और FormClosed के अनुसार प्रतिक्रिया दे सकता है।

मुझे यह स्पष्ट नहीं है कि FormClosing और/या FormClosed उठाए गए हैं यदि आप केवल फॉर्म का निपटान करते हैं लेकिन मैं इसे प्रयोग करने के लिए छोड़ दूंगा।

+2

यदि आप फॉर्म का निपटान करते हैं, तो समापन और बंद घटनाओं को नहीं कहा जाता है। – matrix

+4

कॉलिंग निपटान विधि विंडो के झटके का कारण बनती है जब मॉड्यूल-फॉर्म पर एमडीआई-चाइल्ड विंडो – dotNETbeginner

12

एक सामान्य नियम के रूप में, मैं हमेशा किसी भी वर्ग के लिए निपटान विधि को स्पष्ट रूप से कॉल करने का समर्थन करता हूं, या तो विधि को सीधे कॉल करके या "उपयोग" ब्लॉक में लपेटकर।

अक्सर, आईडीएसओस्पिबल को लागू करने वाली कक्षाएं ऐसा इसलिए करती हैं क्योंकि वे कुछ अप्रबंधित संसाधन को लपेटते हैं जिन्हें मुक्त करने की आवश्यकता होती है। हालांकि इन वर्गों में फाइनलाइज़र होना चाहिए जो एक सुरक्षा के रूप में कार्य करते हैं, निपटान को बुलाए जाने से पहले उस स्मृति को और निचले ओवरहेड से मुक्त करने में मदद मिलेगी।

फॉर्म ऑब्जेक्ट के मामले में, जैसा कि क्यरा के लिंक के रूप में बताया गया है, बंद विधि को आपकी तरफ से निपटान करने के लिए दस्तावेज किया गया है, इसलिए आपको स्पष्ट रूप से ऐसा करने की आवश्यकता नहीं है। हालांकि, मेरे लिए, यह हमेशा एक कार्यान्वयन विस्तार पर भरोसा करने जैसा महसूस किया है। मैं उन क्रियाओं के लिए बंद और निपटान दोनों को हमेशा कॉल करना पसंद करता हूं जो उन्हें लागू करते हैं, कार्यान्वयन परिवर्तन/त्रुटियों के खिलाफ और स्पष्ट होने के लिए सुरक्षा के लिए।एक उचित ढंग से कार्यान्वित निपटान विधि कई बार आमंत्रित करने के लिए सुरक्षित होना चाहिए।

0

एक बहुत अच्छा तरीका using का प्रयोग किया जाता है:

using (MyForm foo = new MyForm()) 
{ 
    if (foo.ShowDialog() == DialogResult.OK) 
    { 
     // your code 
    } 
} 
+0

पर उपयोग किया जाता है '' उपयोग 'कथन केवल' निपटान 'कहता है, जो एक अच्छा अभ्यास है, लेकिन मुझे नहीं लगता कि यह ओपी के प्रश्न का उत्तर देता है । –

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