2010-11-23 21 views
5

क्या यह संभव है कि कचरा कलेक्टर काम पर पठनीय रूप से संशोधक प्रभाव? मूल्य प्रकार के लिए, संदर्भ प्रकार के लिए?कचरा कलेक्टर पर पाठक रूप से संशोधक प्रभाव करता है?

+0

http://stackoverflow.com/questions/1152573/does-readonly-c-reduce-memory-usage –

उत्तर

1

मैं देख नहीं क्यों यह सामान्य रूप से उपयोग जीसी को प्रभावित करना चाहिए। यह सिर्फ एक क्षेत्र है। और जीसी बस संदर्भ प्रकार फ़ील्ड (या संरचना क्षेत्रों में निहित संदर्भ) का पालन करता है।

आप जहां यह जीसी प्रभावित करती है कृत्रिम स्थितियों का निर्माण करने में सक्षम हो सकता है (शायद केवल पढ़ने के लिए मैदान के बचाव की मुद्रा में प्रतियां कोस), लेकिन यह सामान्य उपयोग के साथ घटित नहीं होगा।

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

एक कार्यक्रम व्यवहार को बदलने की बुराई नमूना readonly

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

struct EvilStruct 
{ 
    public readonly object Obj; 

public void SetToNull() 
{ 
    this=new EvilStruct(); 
} 

public EvilStruct(object obj) 
{ 
    Obj=obj; 
} 
} 

readonly EvilStruct s1=new EvilStruct(new object()); 
EvilStruct s2=new EvilStruct(new object()); 

void Main() 
{ 
    s1.SetToNull(); 
s2.SetToNull(); 
s1.Obj.Dump();//An instance of System.Object 
s2.Obj.Dump();//null 
//now s1.Obj can't be collected, but what was once in s2.Obj can 
} 
+0

का संभावित डुप्लिकेट यह नहीं है। केवल क्षेत्र को ही संशोधित करता है जो यह इंगित करता है कि यह क्या इंगित करता है। वस्तु किसी बिंदु पर एकत्र की जाएगी जब यह अब रूट नहीं है। –

+0

एक ऐसे कार्यक्रम का एक उदाहरण मिला जहां एक पाठक वस्तु को एकत्र होने से रोकता है। – CodesInChaos

+0

सबसे अच्छा यह प्रोग्राम दिखाता है कि आपने इसे संकलित करने के लिए परेशान नहीं किया है, क्योंकि 'ऑब्जेक्ट' में कोई 'डंप' विधि नहीं है। साथ ही, आप 'मुख्य' फ़ंक्शन स्थिर नहीं हैं, और यदि ऐसा होता है, तो आप 's1' और' s2' तक नहीं पहुंच सकते हैं। –

6

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

0

readonly एक सी # विशेषता है। जीसी एक सीएलआई सुविधा है। इसलिए, यह सभी पर जीसी को प्रभावित नहीं कर सकता है।

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