ویرگول
ورودثبت نام
زهرا دشتی
زهرا دشتی
خواندن ۲ دقیقه·۳ سال پیش

فرق بین Readonly و Constants در C# (سوالات مصاحبه)

یکی از سوالاتی در مصاحبه های C# و .Net می پرسن، فرق بین فیلدهای Readonly و Constants چیه؟

وقتی modifier یک فیلد readonly هست، مقدار اون فیلد بعد از ساخته شدن نمی تونه تغییر کنه. یعنی یا هنگام declaration می شه بهش مقدار داد یا در سازنده (constructor) اون نوع (type) و کلاس می شه آن رو مقدار دهی کرد. هر نوع تایپی رو می شه به صورت readonly تعریف کرد.

وقتی modifier یک فیلد constant هست، اون فیلد در زمان کامپایل به صورت استاتیک در زمان کامپایل ارزیابی می شه و کامپایلر به معنی واقعی کلمه، هر جا اون رو ببینه با مقدارش جایگزین می کنه (شبیه ماکرو ها در C++). هر نوع تایپ عددی built-in، bool، char، string، و enum ها رو می شه به صورت constant تعریف کرد و با کلمه کلیدی const مشخص می شن.

اما فرق و شباهتشون چیه؟ constant می تونه نقش static readonly بازی کنه اما محدودیت های بیشتری داره. اما تفاوتش همون جایگزینی constant با مقدارش در زمان کامپایل هست. همون طور که در شکل می بینید بالایی به پایینی تبدیل می شه. در مثال زیر مقدار عدد Pi همیشه ثابته پس مناسبه که از const استفاده کنیم.

کد بالا در زمان کامپایل به کد زیر تبدیل می شه:

در مقابل static readonly هربار که برنامه اجرا بشه مقدار می گیره. به کد زیر دقت کنید، StartupTime در هر بار اجرای برنامه مقدار جدید می گیره.

از مزایای static readonly زمانهایی هست که می خوایم به سایر assembly مقداری رو بدیم که در هر نسخه عوض می شه. در مثال زیر فرض کنید که این فیلد در assembly با نام X اومده و چون public هست، در سایر assembly ها که از X استفاده می کنند قابل دستیابیه.

حالا فرض کنید assembly با نام Y به X رفرنس داده و از این constant استفاده می کنه، در نتیجه مقدار 2.3 در Y هنگام کامپایل جایگزین می شه. خوب حالا فرض کنید در X تغییراتی می دیم و مقدار ProgramVersion به 2.4 تبدیل می شه و X مجددا کامپایل می شه. اما Y هنوز همون مقدار 2.3 رو استفاده می کنه! چون هنگام کامپایل اون مقدار جایگزین شده در کدش. در نتیجه مجبوریم دوباره Y رو با نسخه جدید X کامپایل کنیم. اما راه حل این مشکل چیه؟ استفاده از static readonly این مشکل رو برطرف می کنه.

به عبارت دیگه، اگر مقداری در آینده ممکنه تغییر کنه (یعنی در ذات خودش ثابت نباشه) نباید به صورت constant تعریف بشه.

خوب امیدوارم این مطلب براتون مفید باشه. اگر اشکالی در این مطلب می بینید یا چیزی بد بیان شده خوشحال می شم به من بگین :)

مصاحبهcsharpdotnetconstantreadonly
شاید از این پست‌ها خوشتان بیاید