मैं यह जोड़ना चाहूंगा कि: GC.Collect () (+ WaitForPendingFinalizers ()) को कॉल करना कहानी का एक हिस्सा है। जैसा कि दूसरों द्वारा सही उल्लेख किया गया है, GC.COllect () गैर-नियतात्मक संग्रह है और इसे GC (स्वयं CLR) के विवेक पर छोड़ दिया गया है। यहां तक कि अगर आप WaitForPendingFinalizers के लिए एक कॉल जोड़ते हैं, तो यह निर्धारक नहीं हो सकता है। इस msdn लिंक से कोड लें और 1 या 2 के रूप में ऑब्जेक्ट लूप पुनरावृत्ति के साथ कोड को चलाएं। आपको पता चलेगा कि गैर-नियतात्मक अर्थ क्या है (ऑब्जेक्ट के विनाशकर्ता में एक विराम बिंदु सेट करें)। संक्षेप में, विध्वंसक को तब नहीं बुलाया जाता है जब वेट (..) द्वारा केवल 1 (या 2) सुस्त वस्तुएं होती हैं।
यदि आपका कोड अप्रबंधित संसाधनों (उदा: बाहरी फ़ाइल हैंडल) के साथ काम कर रहा है, तो आपको विध्वंसक (या अंतिम रूप) लागू करना होगा।
यहाँ एक दिलचस्प उदाहरण है:
नोट : यदि आपने MSDN से उपरोक्त उदाहरण को पहले ही आज़मा लिया है, तो निम्न कोड हवा को साफ़ करने वाला है।
class Program
{
static void Main(string[] args)
{
SomePublisher publisher = new SomePublisher();
for (int i = 0; i < 10; i++)
{
SomeSubscriber subscriber = new SomeSubscriber(publisher);
subscriber = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(SomeSubscriber.Count.ToString());
Console.ReadLine();
}
}
public class SomePublisher
{
public event EventHandler SomeEvent;
}
public class SomeSubscriber
{
public static int Count;
public SomeSubscriber(SomePublisher publisher)
{
publisher.SomeEvent += new EventHandler(publisher_SomeEvent);
}
~SomeSubscriber()
{
SomeSubscriber.Count++;
}
private void publisher_SomeEvent(object sender, EventArgs e)
{
// TODO: something
string stub = "";
}
}
मेरा सुझाव है, पहले विश्लेषण करें कि आउटपुट क्या हो सकता है और फिर चला जाए और फिर नीचे दिए गए कारण को पढ़ें:
{कार्यक्रम समाप्त होने के बाद विध्वंसक केवल अनुमानित रूप से कहा जाता है। } वस्तु को निर्धारक रूप से साफ करने के लिए, व्यक्ति को आईडीसोपॉलिफ़िक लागू करना चाहिए और डिस्पोज़ () को स्पष्ट कॉल करना चाहिए। यही सार है! :)