2013-04-19 7 views
8

मुझे लगता है कि यह एक बहुत ही मूर्ख सवाल है लेकिन मैं चारों ओर देख रहा हूं और निम्नलिखित प्रश्नों पर उत्तर नहीं ढूंढ पाया। वास्तव में इस पर प्रकाश डालने के उत्तर की सराहना करते हैं।समान चर पर बार-बार नई वस्तुओं को बनाना

1) पिछले ऑब्जेक्ट का क्या होता है यदि एक ही विधि में एक नया प्रारंभ करने पर होता है। उदाहरण:

DataTable dataTable = new DataTable(); 
dataTable = new DataTable(); // Will the previously created object be destroyed and memory freed? 

2) वही प्रश्न (1) लेकिन स्थैतिक चर पर। उदाहरण:

static private DataView dataView; 

private void RefreshGridView() 
{ 
    dataView = new DataView(GetDataTable()); // Will the previously created objects be destroyed and memory freed? 
    BindGridView(); 
} 

धन्यवाद!

+0

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

उत्तर

11

पर Garbage Collection लेख के माध्यम से पढ़ने होने की सलाह देते हैं // पूर्व में बने वस्तु को नष्ट कर दिया और किया जाएगा स्मृति को मुक्त कर दिया?

संभावित रूप से। जैसे ही आप ऐसा करते हैं, अब आप मूल DataTable का संदर्भ नहीं रखेंगे। जब तक इस वस्तु का कोई और संदर्भ न हो, तब तक यह कचरा संग्रह के लिए योग्य हो जाएगा। उसके बाद कुछ बिंदु पर, जीसी दौड़ जाएगा, और ऑब्जेक्ट इकट्ठा करेगा, जो बदले में इसकी स्मृति को मुक्त करेगा।

यह स्थिर, उदाहरण और स्थानीय चर के लिए सच है। इन सभी scnearios में तंत्र समान है।

ध्यान दें कि यदि आप जिस संदर्भ को संदर्भित कर रहे हैं IDisposable लागू करता है, तो संदर्भ खोने से पहले Dispose() पर कॉल करना एक अच्छा अभ्यास है। तकनीकी रूप से, एक उचित ढंग से कार्यान्वित IDisposable कार्यान्वयन अंततः चीजों को सही तरीके से संभालता है, लेकिन जीसी संग्रह होने तक देशी संसाधनों को तब तक जोड़ा जा सकता है, जो जल्दी से नहीं हो सकता है। ध्यान दें कि इसका (प्रबंधित) स्मृति से कोई लेना देना नहीं है, लेकिन अभी भी एक अच्छा अभ्यास है।

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

+0

समझें, इतने कम समय में विस्तृत उत्तर के लिए धन्यवाद! – csharp101

2

संक्षिप्त उत्तर यह है कि यह सब कचरा कलेक्टर द्वारा संभाला जाता है। उदाहरण तुरंत हटा दिए जाएंगे, लेकिन उन्हें बाद में "पहुंचने योग्य" के रूप में चिह्नित किया जाएगा और बाद में मुक्त किया जाएगा।

मैं MSDN

+0

त्वरित उत्तर और ज्ञान स्रोत के लिए धन्यवाद! =) – csharp101

1

ऑब्जेक्ट्स सी # में संदर्भ चर हैं। इसका मतलब है कि वे उनमें स्मृति संदर्भों को संग्रहीत करते हैं।

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

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