.NET- এ, কোন পরিস্থিতিতে আমার ব্যবহার করা উচিত GC.SuppressFinalize()?
এই পদ্ধতিটি ব্যবহার করে আমার কী লাভ (গুলি) করতে পারে?
.NET- এ, কোন পরিস্থিতিতে আমার ব্যবহার করা উচিত GC.SuppressFinalize()?
এই পদ্ধতিটি ব্যবহার করে আমার কী লাভ (গুলি) করতে পারে?
উত্তর:
SuppressFinalizeচূড়ান্তরূপী শ্রেণীর দ্বারা কেবল কল করা উচিত। এটি আবর্জনা সংগ্রাহককে (জিসি) অবহিত করছে যে thisবিষয়টি পুরোপুরি পরিষ্কার হয়ে গেছে ed
IDisposableআপনার চূড়ান্তকরণ করার সময় প্রস্তাবিত প্যাটার্নটি হ'ল:
public class MyClass : IDisposable
{
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// called via myClass.Dispose().
// OK to use any private object references
}
// Release unmanaged resources.
// Set large fields to null.
disposed = true;
}
}
public void Dispose() // Implement IDisposable
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MyClass() // the finalizer
{
Dispose(false);
}
}
সাধারণত, সিএলআর যখন তৈরি হয় তখন তাদের চূড়ান্তকরণের সাথে বস্তুগুলিতে ট্যাব রাখে (তাদের তৈরিতে আরও ব্যয়বহুল করে তোলে)। SuppressFinalizeজিসিকে বলুন যে অবজেক্টটি সঠিকভাবে পরিষ্কার করা হয়েছিল এবং চূড়ান্তকরণকারী সারিতে যাওয়ার দরকার নেই। এটি দেখতে C ++ ডিসস্ট্রাক্টরের মতো দেখায় তবে এর মতো কিছু করে না।
SuppressFinalizeঅপ্টিমাইজেশান হিসাবে আপনার বস্তু একটি দীর্ঘ সময়ের finalizer কিউ অপেক্ষায় থাকতে পারে, তুচ্ছ নয়। SuppressFinalizeঅন্য বিষয়গুলি কল করতে প্রলোভিত হবেন না আপনার মনে। এটি ঘটতে অপেক্ষা করা একটি গুরুতর ত্রুটি।
নকশার নির্দেশিকা আমাদের জানায় যে যদি আপনার অবজেক্ট প্রয়োগ করে তবে একটি চূড়ান্তকরণকারীর প্রয়োজন হয় না IDisposable, তবে আপনার যদি চূড়ান্তকরণকারী থাকে তবে IDisposableআপনার ক্লাসের ডিটারমিনিস্টিক ক্লিনআপের অনুমতি দেওয়ার জন্য আপনার প্রয়োগ করা উচিত ।
IDisposableসংস্থানগুলি পরিষ্কার করতে আপনার বেশিরভাগ সময় দূরে যেতে সক্ষম হওয়া উচিত । আপনার কেবল তখনই চূড়ান্তকরণকারীর প্রয়োজন যখন আপনার অবজেক্টটি নিয়ন্ত্রণহীন সংস্থানগুলিতে ধরে রাখে এবং আপনাকে সেই সংস্থানগুলি পরিষ্কার হয়ে যাওয়ার গ্যারান্টি দেওয়া দরকার।
দ্রষ্টব্য: কখনও কখনও কোডারগুলি তাদের IDisposableক্লাসের বিল্ডগুলি ডিবাগ করতে একটি ফাইনালাইজার যুক্ত করে দেয় যাতে কোডটি তাদের IDisposableবস্তুটি সঠিকভাবে নিষ্পত্তি করে ।
public void Dispose() // Implement IDisposable
{
Dispose(true);
#if DEBUG
GC.SuppressFinalize(this);
#endif
}
#if DEBUG
~MyClass() // the finalizer
{
Dispose(false);
}
#endif
IDisposableনা হয় sealed, তবে এটিতে GC.SuppressFinalize(this) কোনও ব্যবহারকারী-সংজ্ঞায়িত চূড়ান্তকরণকারীর অন্তর্ভুক্ত না হলেও কলটিতে এটি অন্তর্ভুক্ত করা উচিত । এটি উদ্ভুত প্রকারের জন্য উপযুক্ত শব্দার্থবিজ্ঞান নিশ্চিত করতে প্রয়োজনীয় যা কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাইনালাইজার যুক্ত করে তবে কেবল সুরক্ষিত Dispose(bool)পদ্ধতিকে ওভাররাইড করে ।
sealedউদ্ভূত শ্রেণীর জন্য @ সামহরওয়েল দ্বারা উল্লিখিত না হওয়া গুরুত্বপূর্ণ is কোডএনালাইসিসের ফলাফল যখন ca1816 + ca1063 হয় যখন শ্রেণিটি সিল না করা হয় তবে সিল করা ক্লাসগুলি ব্যতীত ভাল থাকে SuppressFinalize।
SupressFinalizeসিস্টেমকে বলে যে চূড়ান্তকরণে যা কিছু করা হত তা ইতিমধ্যে সম্পন্ন হয়েছে, সুতরাং চূড়ান্তকরণকারীর ডাক দেওয়ার দরকার নেই। .NET ডক্স থেকে:
আইডিস্পোজেবল ইন্টারফেস বাস্তবায়নকারী অবজেক্টগুলি আইডিস্পোজেবল থেকে এই পদ্ধতিটি কল করতে পারে the আবর্জনা সংগ্রহকারীকে অবজেক্ট কল করা থেকে বিরত রাখতে ডিসপোজ পদ্ধতি method
সাধারণভাবে, যে কোনও Dispose()পদ্ধতিতে কল করতে সক্ষম হওয়া উচিত GC.SupressFinalize(), কারণ এটি চূড়ান্তকরণে পরিষ্কার করা সমস্ত কিছু পরিষ্কার করা উচিত।
SupressFinalizeকেবলমাত্র এমন একটি বিষয় যা একটি অপ্টিমাইজেশন সরবরাহ করে যা সিস্টেমটিকে চূড়ান্তকরণের থ্রেডে অবজেক্টের কাতারে বিরক্ত করতে দেয় না। একটি সঠিকভাবে লিখিত Dispose()/ চূড়ান্তকরণকারীকে কল করার সাথে বা ছাড়াই সঠিকভাবে কাজ করা উচিত GC.SupressFinalize()।
সেই পদ্ধতিটি কার্যকর করতে সক্ষম Disposeঅবজেক্টগুলির পদ্ধতিতে অবশ্যই IDisposableকল করতে হবে, এই পদ্ধতিতে কোনও ব্যক্তি যদি Disposeপদ্ধতিটি কল করে তবে জিসি চূড়ান্ততরিকে আর একবার কল করবে না ।
দেখুন: GC.SuppressFinalize (অবজেক্ট) পদ্ধতি - মাইক্রোসফ্ট ডক্স
Dispose(true);
GC.SuppressFinalize(this);
যদি অবজেক্টের ফাইনালাইজার থাকে তবে। নেট চূড়ান্তকরণের সারিতে একটি রেফারেন্স রাখে।
যেহেতু আমাদের কল রয়েছে Dispose(ture), এটি স্পষ্ট অবজেক্ট, সুতরাং এই কাজটি করার জন্য আমাদের চূড়ান্তকরণের সারির দরকার নেই।
তাই GC.SuppressFinalize(this)চূড়ান্তকরণের সারিতে কল অপসারণ রেফারেন্স।
যদি কোনও শ্রেণি, বা এটি থেকে প্রাপ্ত কোনও কিছু ফাইনালেরাইজারের সাথে কোনও বস্তুর সর্বশেষ লাইভ রেফারেন্স ধরে রাখতে পারে, তবে সেই চূড়ান্তকরণকারীর দ্বারা বিরূপ প্রভাবিত হতে পারে এমন কোনও ক্রিয়াকলাপের পরেও তাকে GC.SuppressFinalize(this)বা GC.KeepAlive(this)বস্তুটির কাছে ডাকা উচিত, এভাবে ফাইনালাইজার জিতেছে তা নিশ্চিত করে অপারেশন সম্পূর্ণ না হওয়া পর্যন্ত চলবে না।
চূড়ান্তকরণকারী নেই এমন কোনও ক্লাসে ব্যয় GC.KeepAlive()এবং GC.SuppressFinalize(this)মূলত একইরকম এবং চূড়ান্তকরণকারীদের ক্লাসগুলির সাধারণত কল করা উচিত GC.SuppressFinalize(this), সুতরাং শেষের কাজ হিসাবে শেষের কাজটি Dispose()সর্বদা প্রয়োজনীয় নাও হতে পারে তবে এটি হবে না তুমি ভুল.