TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 548 subscribers
Post #27 96
🥊 دوئل حافظه در #C :
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
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →