سازندهها و مخربها
سازندهها (Constructors) و مخربها (Destructors) در سیشارپ اجزای حیاتی برنامهنویسی شیءگرا هستند که چرخه عمر یک شیء را مدیریت میکنند. سازندهها متدهایی ویژه هستند که بهصورت خودکار هنگام ایجاد یک شیء فراخوانی میشوند و وظیفه مقداردهی اولیه به متغیرهای عضو و آمادهسازی شیء برای استفاده را دارند. استفاده صحیح از سازندهها تضمین میکند که شیء در یک وضعیت معتبر آغاز شود و از بروز خطاهای منطقی جلوگیری شود.
مخربها در زمان جمعآوری حافظه توسط Garbage Collector فراخوانی میشوند و هدف اصلی آنها آزادسازی منابع غیرمدیریتی مانند فایلها، کانکشنهای شبکه و دیتابیس است. در پروژههای پیشرفته، ترکیب مخربها با اینترفیس IDisposable و بلوک using امکان مدیریت قطعی منابع را فراهم میکند.
در این آموزش، شما با سینتکس دقیق سازندهها و مخربها، بهترین شیوهها، مدیریت خطاها و جلوگیری از مشکلات رایج مانند نشت حافظه آشنا خواهید شد. همچنین یاد خواهید گرفت که چگونه اصول OOP مانند کپسولهسازی و مسئولیت واحد را در پروژههای سیشارپ پیادهسازی کنید. این مهارتها برای توسعه برنامههای مقیاسپذیر و پایدار در محیطهای واقعی بسیار حیاتی هستند.
مثال پایه
textusing System;
class Person
{
public string Name;
public int Age;
// سازنده
public Person(string name, int age)
{
Name = name;
Age = age;
Console.WriteLine("شیء با موفقیت ساخته شد.");
}
// مخرب
~Person()
{
Console.WriteLine("شیء در حال تخریب است.");
}
public void Display()
{
Console.WriteLine($"نام: {Name}, سن: {Age}");
}
}
class Program
{
static void Main()
{
Person p1 = new Person("علی", 28);
p1.Display();
Person p2 = new Person("زهرا", 32);
p2.Display();
}
}
در این مثال، کلاس Person دارای دو فیلد Name و Age است. سازنده Person(string name, int age) بهطور خودکار هنگام ایجاد شیء فراخوانی میشود و فیلدها را مقداردهی اولیه میکند تا شیء در وضعیت پایدار آغاز شود. مخرب \~Person() زمانی توسط Garbage Collector فراخوانی میشود که شیء از حافظه حذف شود و معمولاً برای آزادسازی منابع غیرمدیریتی کاربرد دارد. متد Display اطلاعات شیء را نمایش میدهد. این مثال نشان میدهد که چگونه میتوان از سازندهها و مخربها برای مدیریت چرخه عمر شیء و منابع استفاده کرد و همچنین رعایت شیوههای استاندارد سیشارپ مانند نامگذاری PascalCase و جلوگیری از نشت حافظه انجام شده است.
مثال کاربردی
textusing System;
class FileManager : IDisposable
{
private string filePath;
private System.IO.StreamWriter writer;
// سازنده
public FileManager(string path)
{
filePath = path;
try
{
writer = new System.IO.StreamWriter(filePath);
Console.WriteLine($"فایل {filePath} باز شد.");
}
catch (Exception ex)
{
Console.WriteLine($"خطا در باز کردن فایل: {ex.Message}");
}
}
public void Write(string data)
{
if (writer != null)
{
writer.WriteLine(data);
Console.WriteLine("داده با موفقیت نوشته شد.");
}
}
// مخرب
~FileManager()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (writer != null)
{
writer.Close();
writer = null;
Console.WriteLine($"فایل {filePath} بسته شد.");
}
}
}
}
class Program
{
static void Main()
{
using (FileManager fm = new FileManager("data.txt"))
{
fm.Write("سلام دنیا");
}
}
}
در این مثال پیشرفته، سازنده FileManager فایل موردنظر را باز میکند و StreamWriter را مقداردهی اولیه میکند. متد Write دادهها را با اطمینان به فایل مینویسد. مخرب \~FileManager() برای آزادسازی منابع غیرمدیریتی فراخوانی میشود، در حالی که IDisposable و بلوک using مدیریت قطعی منابع را تضمین میکنند و GC.SuppressFinalize عملکرد بهتری ارائه میدهد. این الگو OOP، مدیریت استثنا و چرخه عمر شیء را در پروژههای واقعی بهخوبی نمایش میدهد.
بهترین شیوهها و اشتباهات رایج در سیشارپ برای سازندهها و مخربها:
سازندهها را به مقداردهی اولیه و اعتبارسنجی محدود کنید و از عملیات پیچیده یا زمانبر پرهیز کنید. مخربها فقط برای آزادسازی منابع غیرمدیریتی استفاده شوند. پیادهسازی IDisposable تضمین میکند که منابع هم مدیریت شده و هم غیرمدیریتی بهصورت ایمن آزاد شوند.
اشتباهات رایج شامل عدم مدیریت خطاها در سازنده، وابستگی بیش از حد به مخرب برای آزادسازی منابع و عملیات پیچیده در سازنده است. برای رفع خطاها، میتوان از لاگهای Garbage Collector و ابزارهای دیباگینگ استفاده کرد. برای بهینهسازی، شیءهای بزرگ را با دقت اختصاص دهید و عملیات مخرب را سبک نگه دارید. امنیت شامل مدیریت دادههای حساس و Thread Safety است.
📊 جدول مرجع
سیشارپ Element/Concept | Description | Usage Example |
---|---|---|
سازنده | مقداردهی اولیه به فیلدهای شیء | public Person(string name){ Name=name; } |
سازنده Overload | پشتیبانی از چندین حالت مقداردهی اولیه | public Person(string name,int age){ Name=name; Age=age; } |
مخرب | آزادسازی منابع غیرمدیریتی | \~Person(){ /* آزادسازی منابع */ } |
IDisposable | آزادسازی دستی منابع | class FileManager:IDisposable{ public void Dispose(){ /* بسته شدن فایل */ } } |
using | مدیریت اتوماتیک منابع | using(var fm=new FileManager("data.txt")){ fm.Write("..."); } |
خلاصه و گامهای بعدی:
سازندهها و مخربها در مدیریت چرخه عمر شیء و منابع غیرمدیریتی در سیشارپ حیاتی هستند. سازندهها شیء را در وضعیت پایدار آغاز میکنند و مخربها و IDisposable منابع را ایمن آزاد میکنند.
گام بعدی شامل یادگیری سازندههای استاتیک، الگوهای طراحی مانند Singleton و Factory، و مدیریت منابع پیشرفته مانند آزادسازی غیرهمزمان و Thread Safety است. تمرین با فایلها، دیتابیس و شبکه به تسلط بیشتر کمک میکند. منابع اضافی شامل مستندات رسمی مایکروسافت و کتابهای پیشرفته C# هستند.
🧠 دانش خود را بیازمایید
آزمون دانش شما
درک خود از این موضوع را با سوالات کاربردی بسنجید.
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود