सी # फॉर्म। क्लोज बनाम फॉर्म


88

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

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

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

क्या एक का दूसरे पर फायदा है? किन परिदृश्यों के तहत हमें एक दूसरे पर प्राथमिकता देनी चाहिए?


थोड़ा अलग सवाल, एक ही जवाब, आईएमओ: यानी क्लोज एंड डिस्पोज आमतौर पर बराबर होते हैं, सिवाय इसके कि आप एक से अधिक बार क्लोज कॉल कर सकते हैं।
क्रिस डब्ल्यूडब्ल्यू

2
@ क्रिस: आप एक से अधिक बार डिस्पोज भी कह सकते हैं।
हेनक होल्टरमैन

@ क्रिस, डिस्पोज़ को एक से अधिक बार चलाने के लिए डिज़ाइन किया जाना चाहिए। bluebytesoftware.com/blog/…
स्टीवन एवर्स

जो चीज मुझे मिली, वह करीब === रूप के बजाय करीब == रूप है। अदृश्य = झूठा; मैं उम्मीद कर रहा था कि डिस्पोज़ की तुलना में करीब एक नरम विधि होगी।
पीट किर्कम

4
@ पे किरकिम: आप चाहें form.Visible = false;तो कॉल कर सकते हैं form.Hide()। वास्तव में, form.Hide()बस सेट करता है this.Visible = false;
डर्क वोल्मार

जवाबों:


171

MSDN पर यह फोरम आपको बताता है।

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

यदि आप form1.Show()या करते हैं Application.Run(new Form1()), तो जब कॉल किया जाएगा, तब डिस्पोज़ किया जाएगा Close()

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


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

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

13
यह कुछ हद तक MSDN के रूप में msdn.microsoft.com/en-us/library/… पर नहीं है : "एक शर्त जब किसी फॉर्म को क्लोज़ पर डिस्पोज़ नहीं किया जाता है, जब यह एक मल्टीपल-डॉक्यूमेंट इंटरफ़ेस (MDI) का हिस्सा होता है आवेदन, और फॉर्म दिखाई नहीं दे रहा है। इस मामले में, आपको कचरा संग्रहण के लिए फ़ॉर्म के सभी नियंत्रणों को चिह्नित करने के लिए मैन्युअल रूप से डिस्पोज़ करने के लिए कॉल करना होगा। " हालांकि, यह जांचना आसान होना चाहिए कि क्या सरल रूपों के साथ मोडल फॉर्म का निपटान किया जाता है या नहीं।
डर्क वोल्मार


14

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

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

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



6

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

Closeघटनाओं को बढ़ाने का लाभ है (जिसे रद्द किया जा सकता है) जैसे कि एक बाहरी व्यक्ति (प्रपत्र के लिए) देख सकता है FormClosingऔर FormClosedतदनुसार प्रतिक्रिया दे सकता है।

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


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

4
कॉलिंग डिस्पोज़ विधि के कारण खिड़की की झिलमिलाहट होगी, जिसका उपयोग मोडल-फॉर्म ऑन
मडी


0

बंद () - प्रबंधित संसाधन अस्थायी रूप से बंद किया जा सकता है और एक बार फिर से खोला जा सकता है।

निपटान () - स्थायी रूप से प्रबंधित संसाधन को हटाता है या नहीं


3
यह केवल तभी सत्य है जब प्रपत्र का उपयोग करके दिखाया गया था ShowDialog()। अन्यथा, Close()फॉर्म को भी डिस्पोज कर देगा।
पीटर डुनिहो

-1

यदि आप अपने फॉर्म में form.close () का उपयोग करते हैं और अपने फॉर्म का FormClosing इवेंट सेट करते हैं और इस इवेंट में form.close () का उपयोग करते हैं, तो आप असीमित लूप में आते हैं और Argument सीमा से बाहर हो गया और समाधान यह है कि फॉर्म को बदल दें FormClosing की घटना में .close () form.dispose () के साथ। मुझे आशा है कि यह छोटी सी टिप आपकी मदद करेगी !!!


-1

वीएस डायग्नोस्टिक टूल के साथ मेरे पास जो भी प्रयोग है, उसे I कहा जाता है। इसे (तब) फॉर्मक्लोजिंग इवेंट ट्रिगर किया गया। तब जब मैं इसे कॉल करता हूं। फॉर्मक्लासिंग इवेंट में अंत में।) जहां मैं इसमें कई अन्य वस्तुओं का निपटान करता हूं, यह सब कुछ बहुत अधिक चिकना करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.