2010-01-13 21 views
7

मेरे पास एक भारी आबादी वाली सरणीसूची है, जिसे मैं साफ़ करना और पुन: उपयोग करना चाहता हूं। अगर मैं इसे साफ़ करता हूं तो क्या यह पहले इस्तेमाल की गई स्मृति को मुक्त कर देगा?.net ArrayList करता है। साफ़ मेमोरी साफ़ करें?

मुझे यह भी जिक्र करना चाहिए कि सरणीसूची एक कक्षा का एक निजी पठन क्षेत्र है जो अभी भी पहली बार सरणीसूची का उपयोग करने के बाद बहुत सक्रिय कार्य करता है। इसलिए कक्षा के दायरे से बाहर होने के बाद मैं कचरा संग्रह की प्रतीक्षा नहीं कर सकता।

क्या साफ़ विधि पर्याप्त तेज़ है? या मैं एक नई सरणी सूची को नष्ट और बनाना चाहिए?

प्रश्न अद्यतन:

तो मेरे पास है क्षेत्र इस तरह की घोषणा (जॉन की सलाह के लिए धन्यवाद)

/// <summary> 
    /// Collection of tasks. 
    /// </summary> 
    private List<Task> tasks = new List<Task>(); 

तो मैं पॉप्युलेट .... (भारी)

अब के बजाय अगर यह साफ करने और काट-छाँट, मैं सिर्फ कॉल कर सकते हैं:

tasks = new List<Task>(); 

इस सिफारिश की जा सकते हैं?

+0

जॉन के लिए +1 क्योंकि वह वास्तव में इसे कवर किया गया है। हालांकि, स्पष्ट रूप से साफ़ स्मृति वास्तव में मुक्त नहीं होगा - केवल कचरा कलेक्टर ही करता है। सही ढंग से लिखित आईडीस्पोज़ेबल ऑब्जेक्ट्स निपटान के कार्यान्वयन में भी अप्रबंधित स्मृति मुक्त - यदि लागू हो। शायद मैं सिर्फ पैडेंटिक हूं :) –

+0

अच्छा बिंदु एंड्रस, लेकिन मुझे लगता है कि यह मेम कचरा संग्रह के लिए तैयार है। –

उत्तर

16

जो भी आपके इरादे को बेहतर व्यक्त करता है। क्या आप वास्तव में एक नई सूची चाहते हैं? यदि ऐसा है, तो एक नया बनाएँ। यदि आप अवधारणात्मक रूप से एक ही सूची का पुन: उपयोग करना चाहते हैं, तो Clear पर कॉल करें।

ArrayList के लिए दस्तावेज़ का कहना है कि Clear को बरकरार रखे हुए मूल क्षमता करता है - तो आप अभी भी एक बड़ा सरणी होगा, लेकिन यह पिछले तत्व के संदर्भ के बजाय nulls का पूरा हो जाएगा:

Capacity कुछ नहीं बदला है। ArrayList की क्षमता को रीसेट करने के लिए, TrimToSize पर कॉल करें या Capacity संपत्ति सीधे सेट करें। एक खाली ArrayList को ट्रिम करना ArrayList की डिफ़ॉल्ट क्षमता पर सेट करता है।

किसी भी कारण से आप का उपयोग कर List<T> के बजाय उपयोग कर रहे हैं?

+0

हाय जॉन, ज्ञान के आपके प्रश्न की कमी का जवाब देने के लिए मुझे लगता है, सूची का उपयोग करने का क्या फायदा है? –

+1

@ जेएल: जेनेरिक संग्रह आमतौर पर बेहतर होते हैं: संकलन-समय पर सुरक्षित टाइप करें, उपयोग करने में आसान (कैस्ट की कोई आवश्यकता नहीं), मूल्य प्रकारों के लिए अधिक कुशल ... .NET का कौन सा संस्करण आप उपयोग कर रहे हैं? (वे केवल .NET 2.0 और ऊपर से उपलब्ध हैं।) –

+0

अंतिम प्रश्न: यदि मेरे पास भारी मात्रा में सूची थी और इसका उपयोग करने के बाद इसकी सूची नई सूची (स्पष्ट रूप से कहां टी = मेरी कक्षा) पर सेट की गई - क्या यह मुझे एक नई सूची देगी और साथ ही साथ पहले इस्तेमाल किया गया कचरा संग्रह के लिए स्मृति? –

3

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

+1

मैं जीसी.फ्री() पर सहमत हूं, मैं इससे बचता हूं। हालांकि, मैंने ऐसे उदाहरण देखे हैं जहां यह आवश्यक है। मैंने गेम में गलत समय पर कचरा संग्रह से बचने के लिए दृश्यों के बीच एक्सएनए खेलों में इसका उपयोग करने की तकनीकें पढ़ी हैं ... इसका उपयोग है। – Nate

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