আমি এটি যুক্ত করতে চাই: জিসি.কলেক্ট () (+ ওয়েটফরপেন্ডিংফিনালাইজারস ()) কল করা গল্পটির একটি অংশ। যেমনটি অন্যদের দ্বারা যথাযথভাবে উল্লেখ করা হয়েছে, জিসি.কোলোচার () অ-সংজ্ঞাবহ সংগ্রহ এবং এটি নিজেই জিসি (সিএলআর) এর বিবেচনার ভিত্তিতে ছেড়ে যায়। এমনকি যদি আপনি ওয়েটফরপেন্ডিংফাইনালাইজারগুলিতে একটি কল যুক্ত করেন তবে এটি নির্দোষ হতে পারে না। এই এমএসডিএন লিঙ্কটি থেকে কোডটি নিন এবং 1 বা 2 হিসাবে অবজেক্ট লুপ পুনরাবৃত্তির সাহায্যে কোডটি চালান You অবশ্যই, অপেক্ষা করুন .. () দ্বারা সবেমাত্র 1 (বা 2) দীর্ঘতর অবজেক্ট থাকা অবস্থায় ধ্বংসকারীকে ডাকা হয় না [[উদ্ধৃতি রেকর্ড।]
যদি আপনার কোডটি পরিচালনা না করা সংস্থাগুলির সাথে আচরণ করে (উদা: বাহ্যিক ফাইল হ্যান্ডলগুলি), আপনাকে অবশ্যই ডেস্ট্রাক্টর (বা চূড়ান্তকরণকারী) প্রয়োগ করতে হবে।
এখানে একটি আকর্ষণীয় উদাহরণ:
দ্রষ্টব্য : আপনি এমএসডিএন থেকে উপরের উদাহরণটি ইতিমধ্যে চেষ্টা করে থাকলে, নিম্নলিখিত কোডটি বাতাসকে সাফ করতে চলেছে।
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 = "";
}
}
আমি পরামর্শ দিই, প্রথমে আউটপুটটি কী হতে পারে তা বিশ্লেষণ করুন এবং তারপরে চালানো এবং তারপরে নীচের কারণটি পড়ুন:
Program প্রোগ্রামটি শেষ হওয়ার পরে ডেস্ট্রাক্টরকে কেবল অন্তর্নিহিত বলা হয়। Deter অবজেক্টটিকে নির্বিচারে পরিষ্কার করার জন্য, অবশ্যই আইডিস্পোজেবল বাস্তবায়ন করতে হবে এবং ডিসপোজ () এ একটি স্পষ্ট কল করা উচিত। এটাই সারমর্ম! :)