تخریب کننده ها (destructors) در سی شارپ
تخریب کننده ها (destructors) در سی شارپ برای آزادسازی منابع غیرمدیریتشده مانند فایلها و اتصالات استفاده میشوند.
تخریبکنندهها (Destructors) در سی شارپ
تخریبکنندهها (Destructors) در سیشارپ متدهایی هستند که برای انجام عملیات پاکسازی و آزادسازی منابع استفاده میشوند.
این متدها بهطور خودکار توسط Garbage Collector (جمعآوری زباله) زمانی که شیء دیگر قابل دسترسی نباشد و نیاز به پاکسازی منابع خارجی (مانند فایلها، اتصالات شبکه یا پایگاهداده) باشد، فراخوانی میشوند.
تخریبکنندهها دارای نام مشابه کلاس هستند و نمیتوان آنها را مستقیماً فراخوانی کرد.
بهعبارت دیگر، تخریبکنندهها زمانی فراخوانی میشوند که شیء از حافظه حذف میشود و مدیریت منابع غیرمدیریتشده بهطور خودکار انجام میشود.
با این حال، در سیشارپ، تخریبکنندهها بهطور معمول برای آزادسازی منابع غیرمدیریتشده مانند فایلها یا اتصالات خارجی استفاده میشوند.
اما برای مدیریت منابع مدیریتشده (مثل حافظه) نیازی به استفاده از تخریبکنندهها نیست، زیرا Garbage Collector بهطور خودکار آنها را مدیریت میکند.
بهجای تخریبکنندهها، در مواردی که نیاز به مدیریت دقیقتر منابع غیرمدیریتشده باشد، بهتر است از الگوی IDisposable و متد Dispose() استفاده شود.
این روشها به برنامهنویس این امکان را میدهند که منابع را بهصورت دستی و در زمان دلخواه آزاد کند.
تخریبکنندهها در سی شارپ با علامت ~ (تایلد) و نام کلاس تعریف میشوند و به صورت زیر نوشته میشوند:
class SampleClass
{
// Constructor
public SampleClass()
{
Console.WriteLine("Constructor is called.");
}
// Destructor
~SampleClass()
{
Console.WriteLine("Destructor is called.");
}
}

ویژگیهای کلیدی تخریبکنندهها در سی شارپ
نام تخریبکننده دقیقاً مشابه نام کلاس است و هیچ نوع بازگشتی ندارد.
-
پارامترها
تخریبکنندهها هیچ پارامتری نمیگیرند و نمیتوان آنها را اورلود کرد. -
فراخوانی توسط سیستم
تخریبکنندهها بهطور خودکار توسط جمعآوری زبالهها (Garbage Collector) اجرا میشوند. -
عدم کنترل دستی
فراخوانی مستقیم تخریبکننده امکانپذیر نیست و زمان اجرای آن بهصورت دقیق توسط برنامهنویس قابل کنترل نیست.

چرا به تخریبکنندهها نیاز داریم؟
در حالی که سی شارپ از جمعآوری زبالهها (Garbage Collection) برای مدیریت حافظه استفاده میکند، برخی منابع نیاز به آزادسازی دستی دارند، مانند:
-
فایلها
بسته شدن فایلهایی که باز شدهاند. -
اتصالات شبکه
بستن ارتباطات باز. -
منابع غیرمدیریتشده
مانند هندلهای سیستمعامل.
تخریبکنندهها به شما کمک میکنند تا مطمئن شوید این منابع به درستی آزاد میشوند.
🌟 آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
شرکت در دوره آموزش برنامه نویسی سی شارپ
نحوه عملکرد تخریبکنندهها
-
جمعآوری زبالهها (Garbage Collection)
زمانی که یک شیء دیگر قابل دسترس نباشد، جمعآوری زبالهها وظیفه تخریب آن را بر عهده میگیرد. -
فراخوانی تخریبکننده
در فرآیند جمعآوری زبالهها، تخریبکننده فراخوانی میشود تا منابع آزاد شوند. -
آزادسازی منابع
منابع موردنیاز توسط تخریبکننده آزاد میشوند و حافظه بازیابی میشود.
مثال عملی: مدیریت فایل با تخریبکننده
در این مثال، از یک تخریبکننده برای اطمینان از بسته شدن فایل استفاده شده است:
using System;
using System.IO;
class FileHandler
{
private FileStream fileStream;
public FileHandler(string filePath)
{
fileStream = new FileStream(filePath, FileMode.OpenOrCreate);
Console.WriteLine("File opened.");
}
~FileHandler()
{
fileStream.Close();
Console.WriteLine("File closed in destructor.");
}
}
class Program
{
static void Main()
{
FileHandler handler = new FileHandler("example.txt");
}
}

بهترین روشهای استفاده از تخریبکنندهها
-
استفاده از Dispose بهجای Destructor
تخریبکنندهها برای منابع غیرمدیریتشده مناسب هستند، اما برای مدیریت منابع پیچیده، پیادهسازی الگوی IDisposable توصیه میشود. -
حداقلسازی کار تخریبکنندهها
تخریبکنندهها باید ساده باشند و از انجام عملیات پیچیده یا طولانی اجتناب کنند. -
مدیریت همزمانی
اگر تخریبکننده با منابع اشتراکی کار میکند، از قفل (Lock) برای جلوگیری از مشکلات همزمانی استفاده کنید. -
استفاده از دستور using
برای اطمینان از آزادسازی منابع، دستور using یک روش امن و قابل پیشبینی ارائه میدهد:
using (FileStream fs = new FileStream("example.txt", FileMode.OpenOrCreate))
{
// عملیات روی فایل
}
مزایا و معایب تخریبکنندهها
مزایا
-
خودکار بودن فرآیند آزادسازی منابع.
-
جلوگیری از نشت منابع.
معایب
-
عدم کنترل دقیق بر زمان اجرا.
-
تأثیر منفی بر کارایی، زیرا وابسته به جمعآوری زبالههاست.
نکات کلیدی برای بهینهسازی تخریبکنندهها
-
از Logging در تخریبکنندهها استفاده نکنید، زیرا ممکن است در شرایط غیرمنتظره مشکلاتی ایجاد شود.
-
از عملیات سنگین در تخریبکننده اجتناب کنید.
-
اطمینان حاصل کنید که تمامی منابع غیرمدیریتشده بهدرستی آزاد میشوند.
مثال پروژهمحور از تخریب کننده ها (destructors) در سی شارپ
در این پروژه، کلاس FileHandler یک فایل را باز میکند و متدهایی برای خواندن و نوشتن به آن دارد.
پس از اتمام کار با فایل، باید منابع فایل بهطور صحیح آزاد شوند.
تخریبکننده (Destructor) برای بستن فایل بهصورت خودکار هنگام نابودی شیء استفاده میشود.
کد:
using System;
using System.IO;
class FileHandler
{
private FileStream fileStream;
// Constructor - فایل را باز میکند
public FileHandler(string filePath)
{
try
{
fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
Console.WriteLine("File opened successfully.");
}
catch (Exception ex)
{
Console.WriteLine("Error opening file: " + ex.Message);
}
}
// متد برای نوشتن دادهها به فایل
public void WriteToFile(string data)
{
try
{
if (fileStream != null)
{
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(data);
fileStream.Write(byteArray, 0, byteArray.Length);
Console.WriteLine("Data written to file.");
}
}
catch (Exception ex)
{
Console.WriteLine("Error writing to file: " + ex.Message);
}
}
// Destructor - فایل را میبندد
~FileHandler()
{
if (fileStream != null)
{
fileStream.Close();
Console.WriteLine("File closed by destructor.");
}
}
}
class Program
{
static void Main(string[] args)
{
// استفاده از FileHandler
FileHandler handler = new FileHandler("example.txt");
handler.WriteToFile("This is a test message.");
// برای شبیهسازی نابودی شیء و فراخوانی destructor،
// آن را به صورت دستی به null اختصاص میدهیم.
handler = null;
// درخواست Garbage Collector برای آزادسازی منابع
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("End of program.");
}
}
توضیحات کد:
- کلاس FileHandler: این کلاس برای مدیریت فایلها طراحی شده است. در سازنده، فایل باز میشود و در صورت لزوم، دادهها به آن نوشته میشوند.
- متد WriteToFile: دادههای متنی را به فایل مینویسد.
- تخریبکننده ~FileHandler: این تخریبکننده بهطور خودکار توسط Garbage Collector فراخوانی میشود و فایل را میبندد تا منابع آزاد شوند.
- Garbage Collector: در این مثال، برای شبیهسازی فراخوانی تخریبکننده، بهطور دستی Garbage Collector را با GC.Collect() فراخوانی میکنیم تا منابع آزاد شوند.
خروجی:
mathematica
Copy code
File opened successfully.
Data written to file.
File closed by destructor.
End of program.
نکات:
این مثال نشان میدهد که چگونه تخریبکنندهها میتوانند برای آزادسازی منابع خارجی استفاده شوند.
استفاده از Garbage Collector در سیشارپ باعث میشود که فراخوانی تخریبکنندهها بهطور خودکار انجام شود.
در پروژههای واقعی برای آزادسازی منابع، استفاده از IDisposable و متد Dispose() معمولتر است زیرا این روش بهصورت دستی میتواند کنترل شود.


کاربران ما
شما هم نظرتون با ما دریاره “تخریب کننده ها (destructors) در سی شارپ” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید