💾 حافظه کلاسها در #C: راهنمای کامل Fields, readonly و const
تا حالا شده از خودتون بپرسید فرق بین یه فیلد readonly و یه const چیه؟ یا اینکه متغیرهایی که داخل یه کلاس تعریف میکنیم (فیلدها) چطور و کِی مقداردهی میشن؟
امروز میخوایم بریم تو دل کلاسها و با اعضای دادهای اونها و قوانین حاکم بر اونها آشنا بشیم.
1️⃣ فیلدها (Fields):
حافظه داخلی یک آبجکت فیلدها، متغیرهایی هستن که داخل یه کلاس یا struct تعریف میشن و "وضعیت" یا "داده"های اون آبجکت رو در طول عمرش نگه میدارن. هر نمونه (instance) از کلاس، یک کپی مستقل از فیلدهای خودش رو داره.
💡نکته حرفهای (قرارداد نامگذاری):مقداردهی اولیه فیلدها:
یه قرارداد رایج و خوب، استفاده از آندرلاین (_) برای فیلدهای private هست تا به راحتی از متغیرهای محلی و پارامترها تشخیص داده بشن (مثلاً name_).
مقداردهی اولیه به فیلدها اختیاریه. اگه مقداری بهشون ندید، مقدار پیشفرض نوعشون رو میگیرن. نکته مهم اینه که این مقداردهی قبل از اجرای اولین خط کد در سازنده (constructor) انجام میشه.
2️⃣ کلید readonly: فیلدهای فقط-خواندنی 🔒
اگه میخواید یه فیلد فقط یک بار مقداردهی بشه و بعد از ساخته شدن آبجکت دیگه هرگز تغییر نکنه، از readonly استفاده کنید. این برای مقادیری که در زمان ساخت آبجکت مشخص میشن ولی بعدش باید ثابت بمونن، عالیه.
قانون مهم: فیلدهای readonly فقط در دو جا میتونن مقدار بگیرن: یا موقع تعریف اولیه، یا داخل سازنده (constructor) اون کلاس.
public class UserProfile
{
// مقداردهی موقع تعریف
public readonly Guid UserId = Guid.NewGuid();
// تعریف بدون مقدار اولیه
public readonly DateTime RegistrationDate;
public UserProfile()
{
// مقداردهی در سازنده
RegistrationDate = DateTime.UtcNow;
}
public void UpdateProfile()
{
// UserId = Guid.NewGuid(); // ❌ خطای زمان کامپایل!
}
}
3️⃣ دوئل بزرگ: const در برابر static readonly ⚔️
این یکی از کلاسیکترین سوالات مصاحبه و یکی از مهمترین نکات در طراحی حرفهایه. هر دو برای مقادیر ثابت به کار میرن، ولی تفاوتهای حیاتی دارن.
🔵 const (ثابت زمان کامپایل):
• مقدارش باید در زمان کامپایل مشخص و ثابت باشه
(const double Pi = 3.14;).
• کامپایلر مقدارش رو مستقیماً در کد جایگزین میکنه (مثل ماکرو).
• فقط برای انواع داده ساده (عددی، رشته، بولین و...) قابل استفادهست.
🔴 static readonly (ثابت زمان اجرا):
• مقدارش در زمان اجرا (معمولاً موقع استارت برنامه) مشخص میشه.
• یه فیلد واقعیه و در حافظه نگهداری میشه، مقدارش جایگزین نمیشه.
• برای هر نوع دادهای، حتی آبجکتهای پیچیده، قابل استفادهست.
public static readonly DateTime StartupTime = DateTime.Now;
😈تله خطرناک public const:
اگه شما یه public const رو در یک کتابخانه (Assembly A) تعریف کنید و در یک پروژه دیگه (Assembly B) ازش استفاده کنید، مقدار اون ثابت موقع کامپایل در Assembly B "پخته" یا "bake in" میشه. حالا اگه شما مقدار const رو در Assembly A عوض کنید، تا وقتی که Assembly B رو دوباره کامپایل نکنید، همچنان از همون مقدار قدیمی استفاده خواهد کرد! این میتونه منجر به باگهای فاجعهبار بشه. static readonly این مشکل رو نداره و همیشه آخرین مقدار رو میخونه، بنابراین انتخاب امنتریه.
🤔 حرف حساب و تجربه شما
انتخاب درست بین const و static readonly یکی از نشانههای یه توسعهدهنده باتجربهست که به نگهداری بلندمدت کد فکر میکنه.
شما بیشتر از const استفاده میکنید یا static readonly؟ آیا تا حالا به مشکل اسمبلی با const برخورد کرده بودید؟
🔖 هشتگها:
#CSharp #Programming #Developer #DotNet #OOP #CleanCode #BestPractices