दिलचस्प पोस्ट
सरणी में संख्याओं की जोड़ी जो कि दी गई राशि में जोड़ें स्क्रैप करने पर नोड से सभी पाठों में शामिल होने से कैसे बचें पासवर्ड में संरक्षित नेटवर्क ड्राइव को विंडोज में सी # में? एक LINQ क्वेरी परिणाम सेट से डेटासेट या डेटाटाले भरना लिथियम / स्ट्राइकथ्रू को पूरी HTML तालिका पंक्ति से XPath को XElement में प्राप्त करें? Stdio.h कार्य कार्यान्वयन कहाँ खोजना है? स्पार्क डेटाफ़्रेम में एक स्थिर स्तंभ कैसे जोड़ें? किसी ListView पर चयनित आइटम का पृष्ठभूमि का रंग बदलें ग्रेडल के साथ रननबल जार बनाना NumPy में एक सरणी को कैसे सामान्य करना है? Android चेकबॉक्स शैली जेविटी में एक तत्व (नेत्रहीन) के तहत खड़ी किए गए तत्वों को ढूंढें त्रुटि: 'अगर' बिना 'अगर' जीएटीटी कॉलबैक पंजीकृत करने में विफल रहता है

क्या मैं डिस्पोज़ () डाटासेट और डाटाटेबल?

डेटासेट और डेटाटाइबल दोनों को IDisposable को लागू करना है, इसलिए, परंपरागत सर्वोत्तम प्रथाओं द्वारा, मुझे उनके निपटान () तरीकों को कॉल करना चाहिए।

हालांकि, मैंने अभी तक जो पढ़ा है, उसमें डेटासेट और डेटाटाले के पास वास्तव में कोई अप्रबंधित संसाधन नहीं है, इसलिए निदान करें () वास्तव में बहुत कुछ नहीं करता है

साथ ही, मैं सिर्फ using(DataSet myDataSet...) का using(DataSet myDataSet...) नहीं कर सकता क्योंकि डाटासेट में using(DataSet myDataSet...) का एक संग्रह है

तो, सुरक्षित होने के लिए, मुझे अपने डेटासेट के माध्यम से फिर से चलाना होगा। टेबल्स, प्रत्येक डेटाटाबेल्स का निपटान करना, फिर डेटासेट के निपटान करना।

तो, क्या मेरे सभी डेटासेट और डेटाटाबेल्स पर डिस्झ () को कॉल करने की परेशानी है?

परिशिष्ट:

उन लोगों के लिए, जो सोचते हैं कि डाटासेट का निपटान किया जाना चाहिए: सामान्य तौर पर निपटान के लिए पैटर्न का प्रयोग using या try..finally , क्योंकि आप गारंटी देना चाहते हैं कि try..finally () को कहा जाएगा।

हालांकि, यह एक संग्रह के लिए बदसूरत वास्तविक तेजी से हो जाता है। उदाहरण के लिए, आप क्या करते हैं अगर एक कॉल को निपटाने के लिए () एक अपवाद फेंक दिया? क्या आप इसे निगलते हैं (जो "खराब" है) ताकि आप अगले तत्व का निपटान कर सकते हैं?

या, क्या आप यह सुझाव देते हैं कि मैं सिर्फ अपने डेटासेट को बुलाता हूँ। डिस्पज़ (), और मेरी डेटासेट में डेटाटॉल्स का निपटारा करने के बारे में भूल जाओ।

Solutions Collecting From Web of "क्या मैं डिस्पोज़ () डाटासेट और डाटाटेबल?"

यहाँ कुछ चर्चाएं हैं जो बताते हैं कि एक डाटासेट के लिए विस्थापन क्यों आवश्यक नहीं है।

निपटान करने के लिए या निपटाने के लिए नहीं? :

डेटासेट में विस्थापन विधि विरासत के साइड इफेक्ट के कारण ही विद्यमान है- दूसरे शब्दों में, यह वास्तव में अंतिम रूप में उपयोगी कुछ भी नहीं करता है।

डेटाटाले और डेटासेट ऑब्जेक्ट पर कॉल किया जाना चाहिए? एक एमवीपी से कुछ स्पष्टीकरण भी शामिल है:

सिस्टमडेटा नामस्थान (ADONET) में अप्रबंधित संसाधन शामिल नहीं हैं। इसलिए जब तक आप इसे अपने लिए कुछ खास नहीं जोड़ते हैं, तब तक उनमें से किसी को निपटाने की कोई आवश्यकता नहीं है।

निपटान विधि और डेटासेट को समझना? स्कॉटलैंड एलेन से टिप्पणी के साथ एक है:

प्रैट में हम शायद ही कभी एक डाटासेट का निपटारा करते हैं क्योंकि इसमें थोड़ा लाभ होता है "

इसलिए, आम सहमति यह है कि वर्तमान में डेटासेट पर विवाद करने के लिए कोई अच्छा कारण नहीं है

अपडेट (1 दिसंबर, 200 9):

मैं इस उत्तर में संशोधन करना चाहता हूं और स्वीकार करता हूं कि मूल उत्तर दोषपूर्ण था।

मूल विश्लेषण उन वस्तुओं पर लागू होता है जिन्हें अंतिम रूप देने की आवश्यकता होती है – और यह बात है कि किसी सटीक, गहन समझ के बिना सतह पर प्रथाओं को स्वीकार नहीं किया जाना चाहिए, फिर भी खड़ा होता है।

हालांकि, यह पता चला है कि डेटासेट्स, डेटाविज़, डेटाटैबल्स उनके कन्स्ट्रक्शंस में अंतिम रूप से दमन करते हैं – यही कारण है कि उनको स्पष्ट रूप से बुलाओ () कुछ भी नहीं है।

संभवतः, ऐसा इसलिए होता है क्योंकि उनके पास अप्रबंधित संसाधन नहीं हैं; इसलिए इस तथ्य के बावजूद कि मार्शल बेवल्यू कम्पेनेंट अप्रबंधित संसाधनों के लिए भत्ते बनाता है, इन विशेष कार्यान्वयनों की आवश्यकता नहीं है और इसलिए अंतिम रूप देने से इनकार कर सकता है

(जो कि एनटीआईटी लेखकों को सामान्यतया अधिकतम स्मृति पर कब्जा करने वाले प्रकारों पर अंतिम रूप से अंतिम रूप देने के लिए ख्याल रखना होगा, सामान्य रूप से अंतिम रूप से इस प्रकार के अभ्यास के महत्व को बोलता है।)

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

बहुत सारे पढ़ने के बाद, मेरी समझ है:

यदि किसी ऑब्जेक्ट को अंतिम रूप देने की आवश्यकता होती है, तो यह स्मृति की जरूरत से अधिक समय पर कब्जा कर सकता है – यहां क्यों है: ए) किसी भी प्रकार से एक डिस्ट्रक्टर (या किसी प्रकार से एक संहारक परिभाषित करता है जो कि डिस्ट्रिक्ट को परिभाषित करता है) को अंतिम रूप से माना जाता है; ख) आबंटन पर (निर्माता चलाने से पहले), एक सूचक को अंतिम रूप देने की कतार पर रखा गया है; सी) एक अंतिम वस्तु को सामान्य रूप से 2 संग्रहों को पुनः प्राप्त करने की आवश्यकता होती है (मानक 1 के बजाय); घ) अंतिम रूप से छुटकारा एक वस्तु को अंतिम रूप से कतार से नहीं निकालता है (जैसा कि रिपोर्ट एसओएस में अंतिम रूप से है) यह कमांड भ्रामक है; यह जानने के लिए कि अंतिम रूप देने वाली कतार (वस्तुओं और स्वयं) में कौन सा ऑब्जेक्ट उपयोगी नहीं हैं; यह जानने के लिए कि अंतिम रूप देने वाली कतार में कौन से वस्तुएं हैं और अभी भी अंतिम रूप देने की आवश्यकता होगी (इस के लिए कोई कमांड है?)

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

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

  • चूंकि डेटाटाबल, डेटासेट, डेटाविय अप्रबंधित संसाधनों को नहीं पेश करते हैं, वे अपने कंस्ट्रक्टरों में अंतिम रूप से दमन करते हैं
  • हालांकि यह एक असामान्य पैटर्न है, यह कॉलर को उपयोग के बाद विच्छेद करने के बारे में चिंता करने से मुक्त करता है
  • यह, और तथ्य यह है कि डेटाटाबेल्स संभावित रूप से विभिन्न डाटासेट्स में साझा किए जा सकते हैं, यह संभावना है कि डाटासेट्स बच्चों के डेटाटैबल्स के निपटान की परवाह नहीं करते हैं
  • इसका यह भी मतलब है कि इन ऑब्जेक्ट्स एसओएस में!
  • हालांकि, इन ऑब्जेक्ट्स को अभी भी एक संग्रह के बाद पुनः प्राप्त करने योग्य होना चाहिए, जैसे कि उनके गैर-अंतिम समकक्षों

4 (नया संदर्भ):

मूल उत्तर:

इस पर बहुत भ्रामक और आम तौर पर बहुत खराब जवाब दिए गए हैं – यहां आने वाले किसी व्यक्ति को शोर की अनदेखी करनी चाहिए और नीचे दिए गए संदर्भों को सावधानी से पढ़ें।

एक शक के बिना, निपटान किसी भी अंतिम वस्तु योग्य वस्तुओं पर बुलाया जाना चाहिए

डाटाटेबिल अंतिम

कॉलिंग डिस्पोज़ा मेमोरी के पुन: प्राप्त करने में काफी तेज गति होती है।

MarshalByValueComponent GC.SuppressFinalize को () इसे अपने निपटान में () कहते हैं- इस अर्थ को छोड़कर दर्जनों तक इंतजार करना होगा, यदि स्मृति के पहले सैकड़ों Gen0 संग्रह को पुनः प्राप्त नहीं किया गया है:

अंतिम रूप देने की इस बुनियादी समझ से हम पहले ही कुछ बहुत महत्वपूर्ण चीजें निकाल सकते हैं:

सबसे पहले, ऑब्जेक्ट्स जिन्हें ऑप्टीमाइजेशन की आवश्यकता होती है, उन ऑब्जेक्ट्स से अधिक लंबे समय तक रहती है जो नहीं होती वास्तव में, वे बहुत अधिक समय तक रह सकते हैं उदाहरण के लिए, मान लीजिए कि जीन 2 में मौजूद वस्तु को अंतिम रूप दिया जाना चाहिए। अंतिम निर्धारण निर्धारित किया जाएगा लेकिन ऑब्जेक्ट अभी भी 2 में है, इसलिए इसे पुन: एकत्रित नहीं किया जाएगा जब तक कि अगले gen2 संग्रह नहीं होगा। यह वास्तव में बहुत लंबा समय हो सकता है, और वास्तव में, यदि चीजें अच्छी तरह से चल रही हैं तो यह बहुत लंबा समय हो सकता है, क्योंकि जीन 2 संग्रह महंगा हैं और इस तरह हम चाहते हैं कि वे कभी-कभी ऐसा न करें। पुरानी चीजों को अंतिम रूप देने के लिए दर्जनों इंतजार करना पड़ सकता है यदि उनकी जगह पर सैकड़ों जनक संग्रह संग्रहित नहीं होता है।

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

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

इसे किसी ऐसे व्यक्ति से ले लें जो Gen2 में गैर-संदर्भित डेटाटाइल्स के 100 एमबी की देखे गए हैं: यह बहुत महत्वपूर्ण है और इस धागे पर जवाबों से पूरी तरह से मिट जाता है।

संदर्भ:

1 – http://msdn.microsoft.com/en-us/library/ms973837.aspx

2 – http://vineetgupta.spaces.live.com/blog/cns!8DE4BDC896BEE1AD!1104.entry http://www.dotnetfunda.com/articles/article524-net-best-practice-no-2-improve-garbage -collector प्रदर्शन का उपयोग-finalizedispose-pattern.aspx

3 – http://codeidol.com/csharp/net-framework/Inside-the-CLR/Automatic-Memory-Management/

आपको यह मानना ​​चाहिए कि यह कुछ उपयोगी और कॉल निपटाना है, भले ही यह वर्तमान में कुछ भी नहीं करता है नेट फ्रेमवर्क अवतार, इसमें कोई गारंटी नहीं है कि यह भविष्य के संस्करणों में अक्षम रहेगा जिससे अप्रभावी संसाधन उपयोग हो सके।

यहां तक ​​कि यदि ऑब्जेक्ट में कोई अप्रबंधित संसाधन नहीं हैं, तो ऑब्जेक्ट ग्राफ़ को तोड़कर जीसी को मदद मिल सकती है। सामान्य तौर पर, यदि ऑब्जेक्ट आईडीआईपोज़ोज़बल लागू करता है तो डिस्जिज () को कॉल किया जाना चाहिए।

चाहे डिस्पाज़ () वास्तव में कुछ है या नहीं दिए गए वर्ग पर निर्भर करता है डेटासेट के मामले में, निपटान () कार्यान्वयन MarshalByValueComponent से विरासत में मिला है। यह कंटेनर से खुद को हटा देता है और डिस्पाइज इवेंट को कॉल करता है। स्रोत कोड नीचे है (एनएटी रिफ्लेक्टर के साथ अलग किया गया है):

 protected virtual void Dispose(bool disposing) { if (disposing) { lock (this) { if ((this.site != null) && (this.site.Container != null)) { this.site.Container.Remove(this); } if (this.events != null) { EventHandler handler = (EventHandler) this.events[EventDisposed]; if (handler != null) { handler(this, EventArgs.Empty); } } } } } 

क्या आप अपने डेटाटैबल्स बनाते हैं? क्योंकि किसी भी ऑब्जेक्ट (जैसे डेटासेट Tables के रूप में) के बच्चों के माध्यम से चलना आम तौर पर जरूरी नहीं होता है, क्योंकि यह माता-पिता का काम है कि यह उसके सभी बच्चे के निपटान के लिए है

आम तौर पर, नियम यह है: यदि आपने इसे बनाया है और यह IDisposable लागू करता है, तो इसे विच्छेद करें। यदि आप इसे नहीं बनाते हैं, तो इसे निपटान मत करो, यह मूल वस्तु का काम है। लेकिन प्रत्येक वस्तु के विशेष नियम हो सकते हैं, दस्तावेज़ीकरण की जांच करें।

.Net 3.5 के लिए, यह स्पष्ट रूप से कहता है "इसे अब का उपयोग न करें", तो यही है कि मैं क्या करूँगा।

मैं किसी वस्तु के किसी भी समय ऑब्जेक्ट लागू करने का अनुरोध करता हूं। यह एक कारण के लिए है

डेटासेट भारी स्मृति के होग्स हो सकते हैं जितनी जल्दी वे साफ करने के लिए चिह्नित किया जा सकता है, बेहतर है।

अद्यतन करें

जब मैंने इस सवाल का जवाब दिया तो 5 साल हो गए हैं। मैं अभी भी अपने जवाब से सहमत हूं यदि कोई विस्थापन विधि है, तो आपको उस वस्तु के साथ बुलाया जाना चाहिए जब आप वस्तु के साथ किया जाए IDispose इंटरफ़ेस एक कारण के लिए लागू किया गया था।

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

मैं सचमुच चाहती हूं कि जवाब देने से पहले एक टिप्पणी लिखने के लिए वोट करने के लिए मजबूर लोगों को मजबूर कर दिया।

डेटासेट IDisposable पूरी तरह से मार्शलबिवाई वैल्यू कम्पेनेंट को कार्यान्वित करता है, जो आईडीिसस्पोज़ाबल लागू करता है। चूंकि डेटासेट प्रबंधित किए जाते हैं इसलिए निपटाना कॉल करने के लिए कोई वास्तविक लाभ नहीं है।

सबसे पहले मैं एक डाटासेट के साथ क्या निपटान करेगा यह जांचता हूं। शायद रेगनेट से परावर्तक का उपयोग करने में मदद मिलेगी

साफ़ () फ़ंक्शन का उपयोग करने का प्रयास करें यह निपटाने के लिए मेरे लिए बहुत अच्छा काम करता है

 DataTable dt = GetDataSchema(); //populate dt, do whatever... dt.Clear();