فصل 14 از 40 درس 1 از 1

Constructor و مقداردهی اولیه

Constructor و مقداردهی اولیه

بخشی از آموزش جامع C# و .NET 10

محتوای درس Constructor و مقداردهی اولیه

Constructor تضمین می‌کند Object در زمان ایجاد به وضعیت معتبر برسد. طراحی Constructor باید وابستگی‌ها و داده‌های ضروری را صریح کند و از ایجاد نمونه ناقص جلوگیری کند.

۱. Default Constructor

اگر Constructor صریحی تعریف نشود، در شرایط معمول یک Constructor بدون پارامتر تولید می‌شود. با تعریف Constructor سفارشی این رفتار تغییر می‌کند.

مثال

class Product { public Product(){ Console.WriteLine("Created"); } }
         _ = new Product();

در این مثال، مفهوم «Default Constructor» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۲. Parameterized Constructor

پارامترهای Constructor برای داده‌هایی مناسب‌اند که بدون آن‌ها Object معنای معتبر ندارد.

مثال

class Product { public string Name{get;} public Product(string name)=>Name=name; }
         Console.WriteLine(new Product("Mouse").Name);

در این مثال، مفهوم «Parameterized Constructor» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۳. Overloading

چند Constructor می‌توانند مسیرهای مختلف ایجاد Object را فراهم کنند، اما بهتر است منطق مقداردهی تکرار نشود.

مثال

static int Add(int a,int b)=>a+b;
         static double Add(double a,double b)=>a+b;
         Console.WriteLine(Add(2,3));

در این مثال، مفهوم «Overloading» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۴. this

this به نمونه جاری اشاره می‌کند و برای تفکیک Field از پارامتر یا فراخوانی Constructor دیگر قابل استفاده است.

مثال

class User { public string Name{get;} public User(string name)=>Name=name; public User():this("Unknown"){} }

در این مثال، مفهوم «this» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۵. Primary Constructor

در نسخه‌های جدید C# امکان تعریف Primary Constructor برای برخی Typeها وجود دارد و می‌تواند کد تشریفاتی را کاهش دهد.

مثال

class Rectangle(double w,double h){ public double Area=>w*h; }
         Console.WriteLine(new Rectangle(2,3).Area);

در این مثال، مفهوم «Primary Constructor» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۶. مثال‌های عملی

public class Product
         {
             public string Name { get; }
             public decimal Price { get; }
         
             public Product(string name, decimal price)
             {
                 Name = name;
                 Price = price;
             }
         }

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

public Product(string name) : this(name, 0m)
         {
         }

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

۷. خطاهای رایج

• انجام I/O سنگین یا عملیات طولانی داخل Constructor

• پذیرش وضعیت نامعتبر و اصلاح آن در متدهای بعدی

• تکرار کد میان چند Constructor

۸. نکات اجرایی

• نام‌ها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.

• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.

• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.

۹. تمرین عملی

کلاس Customer طراحی کنید که نام و شماره تماس ضروری باشند و Constructor از ایجاد نمونه با مقدار خالی جلوگیری کند.

۱۰. جمع‌بندی

در این فصل، مبانی «Constructor و مقداردهی اولیه» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.