Value Types در برابر Reference Types
تا حالا شده یه متغیر رو جایی عوض کنی و ببینی یه جای دیگه هم ناخواسته تغییر کرده؟ یا برعکس، انتظار داشتی تغییر کنه ولی نکرده؟ ریشه ۹۰٪ این مشکلات، درک نکردن تفاوت بین Value Type و Reference Type هست.
این بحث فقط یه تئوری خشک و خالی نیست، بلکه کلید نوشتن کدهای بدون باگ و قابل پیشبینیه. بزن بریم این راز بزرگ رو کشف کنیم!
Value Types: کپی برابر اصل
فکر کنید Value Type مثل یه تیکه کاغذه. وقتی اون رو به متغیر دیگهای میدین، یه کپی کامل ازش گرفته میشه. حالا هر بلایی سر اون کپی بیاد، کاغذ اصلی شما صحیح و سالمه!
شامل چه چیزایی میشه؟ تمام انواع عددی (int, double و...)، bool، char و مهمتر از همه، structها.
بیاین با مثال Point که به صورت struct تعریف شده ببینیم:
public struct Point { public int X, Y; }
Point p1 = new Point();
p1.X = 7;
// این خط، یک کپی کامل از p1 در p2 ایجاد میکنه
Point p2 = p1;
// حالا p1 و p2 دو موجودیت کاملاً جدا در حافظه هستن
Console.WriteLine($"p1.X: {p1.X}, p2.X: {p2.X}");
// p1.X: 7
// p2.X: 7
// اگه p1 رو تغییر بدیم، هیچ تأثیری روی p2 نداره
p1.X = 9;
Console.WriteLine($"p1.X: {p1.X}, p2.X: {p2.X}");
// p1.X: 9
// p2.X: 7همونطور که میبینید، p2 زندگی خودشو داره و از تغییر p1 خبردار هم نمیشه!
Reference Types: یک آدرس، چند نفر
حالا فکر کنید Reference Type مثل کلید یه خونهست. شما خودِ خونه رو به کسی نمیدین، فقط یه کلید ازش کپی میکنید و بهش میدین. هر کسی که کلید رو داشته باشه، میتونه بره داخل و دکوراسیون رو عوض کنه و این تغییر برای همه اونایی که کلید دارن، قابل مشاهدهست!
شامل چه چیزایی میشه؟ تمام classها، string، آرایهها، delegateها و interfaceها.
حالا همون مثال Point رو این بار به صورت class تعریف میکنیم:
public class Point { public int X, Y; }
// ...
Point p1 = new Point();
p1.X = 7;
// این خط، فقط آدرس (رفرنس) p1 رو در p2 کپی میکنه
// حالا هر دو به یک آبجکت در حافظه اشاره دارن
Point p2 = p1;
Console.WriteLine($"p1.X: {p1.X}, p2.X: {p2.X}");
// p1.X: 7
// p2.X: 7
// اگه p1 رو تغییر بدیم، چون p2 هم به همون خونه نگاه میکنه، اونم تغییر رو میبینه
p1.X = 9;
Console.WriteLine($"p1.X: {p1.X}, p2.X: {p2.X}");
// p1.X: 9,
// p2.X: 9اینجا دیگه p1 و p2 شریک جرم هستن! تغییر روی یکی، روی اون یکی هم تأثیر میذاره.
🔖 هشتگها : #MemoryManagement