Boxing และ Unboxing เป็นกระบวนการแปลงระหว่าง Value Type (struct, int, double, etc.) และ Reference Type (object)
Boxing (Value Type → Reference Type)
- แปลง Value Type ให้เป็น Object (บน Heap)
- Implicit Conversion - เกิดขึ้นอัตโนมัติ
- คัดลอกค่าจาก Stack ไป Heap
int val = 42; object obj = val; // Boxing - Implicit
Unboxing (Reference Type → Value Type)
- แปลง Object กลับเป็น Value Type
- Explicit Conversion - ต้อง Cast เอง
- คัดลอกค่าจาก Heap กลับ Stack
- โยน
InvalidCastExceptionหาก Type ไม่ตรง
object obj = 42; int val = (int)obj; // Unboxing - Explicit Cast
ตารางเปรียบเทียบ
| คุณสมบัติ | Boxing | Unboxing |
|---|---|---|
| ทิศทาง | Value Type → Object | Object → Value Type |
| Memory | Stack → Heap (Copy) | Heap → Stack (Copy) |
| Conversion | Implicit (อัตโนมัติ) | Explicit (ต้อง Cast) |
| Performance | ช้ากว่า (Allocation + Copy) | ช้า (Type Check + Copy) |
| Exception | ไม่มี | InvalidCastException หาก Type ผิด |
ตัวอย่างสมบูรณ์
int a = 10;
object obj = a; // Boxing
int b = (int)obj; // Unboxing
// Boxing ใน Method Call (Parameter เป็น object)
void Print(object o) { Console.WriteLine(o); }
Print(10); // Boxing เกิดขึ้นที่นี่
// Generic หลีกเลี่ยง Boxing
void Print<T>(T value) { Console.WriteLine(value); }
Print(10); // No Boxing!
ผลกระทบประสิทธิภาพ
- Boxing/Unboxing บ่อยครั้ง ทำให้ GC กดดัน Memory Pressure
- ใช้ Generics แทน
objectเพื่อหลีกเลี่ยง Boxing - ใช้
Span<T>,Memory<T>สำหรับ High-performance scenarios
สรุป: Boxing = Implicit, Heap Allocation | Unboxing = Explicit Cast, Type Check, Copy Back