2009-05-29 4 views
5

अगर मैं निम्नलिखित है:क्या कचरा कलेक्टर स्पष्ट वस्तुओं को घटनाओं की सदस्यता लेता है?

public class Test 
{ 
    public static void Main() 
    { 
     List<Person> persons = new List<Person> { new Person() }; 

     persons[0].Sneezing += new EventHandler(Person_Sneezing); 

     persons = null; 
    } 

    public static void Person_Sneezing(object sender, EventArgs e) 
    { 
     (sender as Person).CoverFace(); 
    } 
} 

व्यक्ति उस व्यक्ति में था [0] अभी भी स्मृति में मौजूद है, क्योंकि यह प्रतिनिधि छींकने है Person_Sneezing विधि के लिए एक संदर्भ है या यह जीसी द्वारा एकत्र हो जाता है करता है?

उत्तर

8

यह जीसी द्वारा एकत्र किया जाएगा। स्मृति में रखा जाना करने के लिए एक वस्तु प्रत्यक्ष या परोक्ष रूप से संदर्भित किया जाना चाहिए ... ढेर

  • एक मजबूत जीसी में निहित एक मूल्य संभाल
  • एक कोने मामले या दो मैं पर

    1. मान इस समय

    यह व्यक्तियों के लिए यह सच नहीं है [0]। तो यह एकत्र किया जाएगा।

    यह निश्चित रूप से माना जाता है कि व्यक्ति() के लिए निर्माता कुछ थ्रेडलोकल स्टोरेज में जोड़ने जैसे मजाकिया नहीं करता है।

  • 1

    आपके द्वारा पहले से प्राप्त उत्तरों के आगे, आपको और यथार्थवादी उदाहरणों में सावधान रहना होगा।

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

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

    6

    आप वहां आधा रास्ते हैं; अगर यह अन्य तरीकों से था तो यह एक स्मृति रिसाव होगा। यही है, अगर यह इस तरह देखा:

    public class Test 
    { 
        public void HookupStuff() 
        { 
         List<Person> persons = new List<Person> { new Person() }; 
    
         this.EventHappened += new EventHandler(persons[0].SomeMethod); 
         // persons[0].Sneezing += new EventHandler(Person_Sneezing); 
    
         persons = null; 
        } 
    } 
    

    अब persons[0] रहेंगे, भले ही आप के बाद से माता पिता वर्ग उस पर एक विधि के लिए एक संदर्भ है persons बाहर nulled,।

    +0

    क्या आप इसे रिसाव कहते हैं? यदि टेस्ट रास्ता जाता है तो व्यक्ति [0] करता है। –

    +0

    निश्चित रूप से, लेकिन सब कुछ दूर चला जाता है * आखिरकार * - सबसे बुरी स्थिति में, जब आपका आवेदन निकलता है तो यह सब दूर हो जाएगा! जब मैं सोचता हूं कि यह दूर जा रहा है तो मैं इसे दूर नहीं ले जाऊंगा। – mquander

    +0

    (इसके अलावा, यदि आपने व्यक्तियों [0] के लिए कोई और संदर्भ नहीं दिया है, तो आपको इसे वापस पाने के लिए कठोर दबाव डाला जाएगा, इसलिए यह मूल रूप से शून्यता में लीक हो जाता है।) – mquander