تكرار السؤال: …
الإجابة المختصرة
الـ Value Types ترث من System.ValueType وتخزن قيمتها مباشرة (غالباً في الـ Stack أو داخل الكائن الحاوي)، بينما الـ Reference Types ترث من System.Object وتخزن مراجعها في الـ Stack وتشير لبيانات في الـ Managed Heap.
الشرح
تشمل أنواع القيمة (structs والـ primitives والـ enums) وتتميز بالنسخ بالقيمة عند التمرير. أما أنواع المرجع (classes والـ interfaces والـ strings والـ arrays) فتمرر كمراجع تشير لنفس المساحة في الـ Managed Heap، ويدير الـ Garbage Collector استرجاعها.
مثال بالكود
// Value type
int a = 10;
int b = a; // نسخ القيمة
b = 20; // a تظل 10
// Reference type
var user1 = new User { Name = "Ali" };
var user2 = user1; // نسخ المرجع
user2.Name = "Zaid"; // user1.Name يتغير لـ Zaidأخطاء شائعة
- الاعتقاد بأن كل الـ Value Types تخزن حصراً في الـ Stack دائماً؛ إذا كانت الخاصية داخل كائن class، فإنها تخزن في الـ Heap كجزء منه.
أسئلة متابعة
- ما هي عمليتا Boxing و Unboxing في C# ولماذا يجب تجنبهما في المسارات البرمجية عالية الكثافة؟
- كيف تعمل ميزة Nullable Reference Types في C# وما دور التحليل الثابت لمسار الكود (Flow Analysis)؟