Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Boxing และ Unboxing ใน C#: ความแตกต่าง

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

ตารางเปรียบเทียบ

คุณสมบัติBoxingUnboxing
ทิศทางValue Type → ObjectObject → Value Type
MemoryStack → Heap (Copy)Heap → Stack (Copy)
ConversionImplicit (อัตโนมัติ)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