۱۴۰۴/۰۷/۰۹ Nebular

Memory Management و Performance در C#

✅ Stack vs Heap و تاثیر آن بر Performance

ویژگیStackHeap
محل ذخیرهمتغیرهای Value Type و Reference Pointerهاخود شیءهای Reference Type
سرعتبسیار سریع (LIFO, مدیریت خودکار)نسبتاً کند (مدیریت توسط GC)
مدیریت حافظهخودکار هنگام خروج از ScopeGarbage Collector باید تشخیص دهد که دیگر شیء استفاده نمی‌شود
مثال‌هاint, bool, struct, doubleclass, string, array, List<T>

✅ Value Type vs Reference Type

نوعمحل ذخیرهعملکرد
Value Type (مثل int, float, struct)کاملاً در Stack ذخیره می‌شوندسریع و سبک
Reference Type (مثل class, string)در Stack فقط Reference نگه‌داری می‌شود، ولی شیء در Heap ساخته می‌شودکندتر چون تخصیص و آزادسازی پیچیده‌تر است

✅ Garbage Collector (GC)

  • در C#، Heap به صورت دستی آزاد نمی‌شود.
  • GC به صورت خودکار وقتی تشخیص دهد شیء دیگر استفاده نمی‌شود، آن را آزاد می‌کند.
  • این کار هزینه دارد و ممکن است باعث توقف لحظه‌ای (Pause) در برنامه شود.

⚠️ Boxing و Unboxing — دشمن Performance

🔹 Boxing چیست؟

وقتی یک Value Type به Reference Type تبدیل می‌شود:

int x = 10;
object obj = x; // Boxing → int داخل heap قرار می‌گیرد

🔹 Unboxing چیست؟

وقتی Reference دوباره به Value Type تبدیل شود:

int y = (int)obj; // Unboxing → بازیابی مقدار از heap

❌ مشکلش چیه؟

  • هزینه‌ی زمانی و حافظه دارد چون:
    • مقدار از Stack به Heap منتقل می‌شود.
    • GC بعداً باید آن را مدیریت کند.

✅ راه مقابله با Boxing → استفاده از Generics

ArrayList list = new ArrayList();
list.Add(10); // boxing رخ می‌دهد

List<int> list2 = new List<int>(); 
list2.Add(10); // بدون boxing → سریع‌تر

✅ جمع‌بندی مهم برای آزمون

نکتهتوضیح
Stack سریع‌تر از Heap استچون ساختارش ساده‌تر است (LIFO)
Value Type → Stackسبک و سریع
Reference Type → Heapکندتر و نیازمند GC
GC هزینه داردبهتر است تعداد اشیاء بی‌مصرف را کم کنیم
Boxing هزینه داردبا Generics جلوگیری کنیم
Accept Cookies
Accept Cookies
[your-shortcode]