تفاوتهای Reference Type و Value Type
تفاوتهای Reference Type و Value Type در سیشارپ

مقدمه
در سیشارپ، دادهها به دو دستهی اصلی تقسیم میشوند:
Value Type (انواع مقداری)
Reference Type (انواع ارجاعی)
شناخت این تفاوتها یکی از بنیادیترین مفاهیم در برنامهنویسی داتنت است. اگر این تفاوتها را ندانیم، به راحتی با باگهای عجیب و مشکلات کارایی روبرو میشویم.
1. محل ذخیرهسازی دادهها
Value Type: مقدار واقعی در Stack ذخیره میشود.
Reference Type: یک آدرس (Reference) در Stack نگه داشته میشود و دادهی واقعی در Heap ذخیره میشود.
مثال:
2. نحوه کپی شدن دادهها
Value Type: هنگام انتساب، یک کپی مستقل ساخته میشود.
Reference Type: هنگام انتساب، فقط آدرس کپی میشود.
مثال:
3. Null پذیری
Value Type ها به صورت پیشفرض
nullنیستند.Reference Type ها میتوانند
nullباشند.
مثال:
4. مقایسه (==)
Value Type: مقایسه بر اساس مقدار انجام میشود.
Reference Type: مقایسه پیشفرض بر اساس آدرس حافظه است (مگر اینکه
Equalsیا==Overload شده باشد).
مثال:
5. انواع پیشفرض
Value Type ها: همهی انواع عددی (
int,double,bool,char,struct,enum).Reference Type ها: همهی کلاسها (
class)، آرایهها،string،interface,delegate.
6. Performance (کارایی)
Value Type ها سریعتر هستند چون در Stack ذخیره میشوند و مدیریتشان ساده است.
Reference Type ها به دلیل ذخیره در Heap نیازمند Garbage Collector هستند و هزینهی بیشتری دارند.
اما!
اگر struct خیلی بزرگ باشد (مثلاً شامل دهها فیلد)، کپی شدن مکرر آن میتواند کندتر از کلاس باشد.
7. رفتار در متدها
Value Type: مقدار کپی میشود، تغییرات داخل متد اثری روی بیرون ندارد.
Reference Type: آدرس پاس میشود، تغییرات روی شیء بیرونی هم اعمال میشود.
مثال:
8. Boxing و Unboxing
هنگامی که یک Value Type به object (یا interface) تبدیل میشود، باید Boxing شود (انتقال از Stack به Heap).
این عملیات پرهزینه است و در کارایی تأثیر میگذارد.
مثال:
9. Nullable و Reference Type ها
Value Type ها به طور پیشفرض Nullable نیستند ولی میتوان از
Nullable<T>یاT?استفاده کرد.Reference Type ها به صورت پیشفرض Nullable هستند.
از C# 8 به بعد، میتوان با Nullable Reference Types جلوی خطاهای
NullReferenceExceptionرا گرفت.
10. سناریوهای کاربردی
اگر داده کوچک و تغییرناپذیر است (مثل مختصات یک نقطه)،
struct(Value Type) بهتر است.اگر داده بزرگ و دارای رفتار (متدها و منطق) است،
class(Reference Type) مناسبتر است.
نتیجهگیری
شناخت تفاوت بین Value Type و Reference Type برای هر برنامهنویس سیشارپ ضروری است، چون:
روی Performance و مدیریت حافظه تأثیر مستقیم دارد.
مانع از بروز باگهای سخت و غیرمنتظره میشود.
به طراحی درست Domain Model و API کمک میکند.
در دوره جامع برنامه نویسی وب مهندس بهمن آبادی تمامی این موارد کامل توضیح داده شده است.