আপনি এখানে যে জিনিসটি অনুপস্থিত x
তা হ'ল সংকলকটি আপনার চলকটির আধ্যাত্মিক পদ্ধতির সমাপ্তির অবধি প্রসারিত করবে যা এটি সংজ্ঞায়িত করা হয়েছে - এটি কেবল সংকলকটি কিছু করে - তবে এটি কেবল একটি ডিইবিজি তৈরির জন্য এটি করে does
আপনি যদি কোডটি পরিবর্তন করেন যাতে ভেরিয়েবলটি একটি পৃথক পদ্ধতিতে সংজ্ঞায়িত করা হয় তবে এটি আপনার প্রত্যাশা অনুযায়ী কাজ করবে।
নিম্নলিখিত কোডের আউটপুট হল:
False
True
এবং কোড:
using System;
namespace ConsoleApp1
{
class Finalizable
{
~Finalizable()
{
_extendMyLifetime = this;
}
public static bool LifetimeExtended => _extendMyLifetime != null;
static Finalizable _extendMyLifetime;
}
class Program
{
public static void Main()
{
test();
Console.WriteLine(Finalizable.LifetimeExtended); // False.
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(Finalizable.LifetimeExtended); // True.
}
static void test()
{
new Finalizable();
}
}
}
তাই মূলত আপনার বোঝার সঠিক ছিল, কিন্তু আপনি কি জানতেন না যে গোপন কম্পাইলার আপনার পরিবর্তনশীল টিকিয়ে রাখার জন্য যাচ্ছিলেন পর্যন্ত পর তোমাকে ডেকেছিলাম GC.Collect()
- এমনকি আপনি যদি সুস্পষ্টরূপে নাল তা সেট!
আমি উপরে উল্লিখিত হিসাবে, এটি কেবল একটি ডিইবিইউজি বিল্ডের জন্য ঘটে - সম্ভবত পদ্ধতিটির শেষে ডিবাগ করার সময় আপনি স্থানীয় ভেরিয়েবলের মানগুলি পরীক্ষা করতে পারেন (তবে এটি কেবল একটি অনুমান!)!
মূল কোডটি রিলিজ বিল্ডের প্রত্যাশার মতো কাজ করে - সুতরাং false, true
একটি রিলিজ বিল্ড এবং false, false
একটি ডিইবিইউজি বিল্ডের জন্য নিম্নলিখিত কোড আউটপুট দেয় :
using System;
namespace ConsoleApp1
{
class Finalizable
{
~Finalizable()
{
_extendMyLifetime = this;
}
public static bool LifetimeExtended => _extendMyLifetime != null;
static Finalizable _extendMyLifetime;
}
class Program
{
public static void Main()
{
new Finalizable();
Console.WriteLine(Finalizable.LifetimeExtended); // False.
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(Finalizable.LifetimeExtended); // True iff RELEASE build.
}
}
}
সংযোজন হিসাবে: নোট করুন যে আপনি যদি কোনও শ্রেণীর জন্য ফাইনালাইজারে এমন কিছু করেন যা কারণে কোনও কারণটিকে কোনও প্রোগ্রামের মূল থেকে অ্যাক্সেসযোগ্য বলে প্রমাণিত করা হয়, তবে সেই বস্তুটি আর আবর্জনা-সংগ্রহ করা হবে না যতক্ষণ না সেই অবজেক্টটি আর না থাকে রেফারেন্সড।
অন্য কথায়, আপনি চূড়ান্তকরণকারীর মাধ্যমে কোনও বস্তুকে "মৃত্যুর স্থগিতাদেশ" দিতে পারেন। এটি সাধারণত একটি খারাপ ডিজাইন হিসাবে ধরা হয়, যদিও!
উদাহরণস্বরূপ, উপরের কোডটিতে, যেখানে আমরা _extendMyLifetime = this
ফাইনালাইজারটি করি সেখানে আমরা বস্তুর জন্য একটি নতুন রেফারেন্স তৈরি করছি, সুতরাং এটি আর আবর্জনা-সংগ্রহ করা হবে না যতক্ষণ না _extendMyLifetime
(এবং অন্য কোনও রেফারেন্স) আর এর উল্লেখ না করে।
Person1
? আমি শুধু দেখতেPerson
। শেষ: চূড়ান্তকরণকারীরা কীভাবে কাজ করে তার জন্য ডকস.মাইক্রোসফট.ডটনেট / সিএসআরপি / প্রোগ্রামগ্রামিং-গাইড দেখুন …