Boxing c#
Minh Khoa
Tác giả
# 🎯 1. Boxing là gì? (định nghĩa chuẩn)
Boxing = hành động chuyển một giá trị kiểu value type (int, float, bool, struct…) thành một object (kiểu reference type).
Tức là C# đóng value vào một “hộp object” trên heap.
Ví dụ:
int x = 5;
object obj = x; // ← boxing xảy ra
x từ value type (lưu trên stack) → copy vào một object (lưu trên heap).
🎯 2. Unboxing là gì?
Lấy value từ object ra:
object obj = 10;
int y = (int)obj; // ← unboxing
🎯 3. Tại sao BOXING gây hại trong Unity?
❌ (1) Boxing tạo ra memory allocation → gây GC
Khi boxing, C# tạo ra một object mới trên heap.
→ Alloc
→ Sau đó GC phải dọn → gây spike, drop FPS.
Trong game, đặc biệt là update loop → rất nguy hiểm.
❌ (2) Xảy ra ngầm → khó phát hiện
Ví dụ:
int x = 10;
Debug.Log(x);
Có boxing vì Log nhận parameter là object.
❌ (3) Boxing xảy ra khi dùng interface
Nếu struct implement interface → gọi interface method → BOX.
public interface IAttack { void Do(); }
public struct Sword : IAttack
{
public void Do() { }
}
IAttack atk = new Sword(); // boxing!
❌ (4) Boxing khi dùng generic không constraint tốt
Ví dụ:
void Print<T>(T value)
{
Debug.Log(value); // boxing nếu value là struct
}
❌ (5) LINQ rất hay gây boxing
LINQ to Object tạo delegate, iterator → allocation + boxing.
🎯 4. Một số ví dụ boxing phổ biến trong Unity
❌ Ví dụ 1: Debug.Log
int score = 10;
Debug.Log(score); // boxing
Cách fix:
Debug.Log($"{score}"); // không boxing (string format)