Trong C#, struct là value type, class là reference type. Cả hai đều gom nhóm dữ liệu và hành vi nhưng có khác biệt quan trọng.
Bảng so sánh chi tiết:
| Đặc điểm | Class | Struct |
|---|---|---|
| Kiểu | Reference type (heap) | Value type (stack/inline) |
| Kế thừa | Hỗ trợ đơn kế thừa, implement interface | Không kế thừa class/struct khác, chỉ implement interface |
| Base class | Có thể làm base class | Không thể làm base class |
| Constructor | Có default constructor, custom constructor | Không cho phép parameterless constructor (trước C# 10), có constructor có tham số |
| Destructor | Có (~ClassName) | Không có destructor/finalizer |
| Instantiation | Cần new (thường) | Có thể không dùng new (giá trị mặc định) |
| Null | Có thể null | Không null (trừ Nullable<T> / T?) |
| Assignment | Copy tham chiếu | Copy giá trị (deep copy fields) |
| Passing method | Truyền tham chiếu | Truyền giá trị (copy) |
| Interface | Implement interface | Implement interface |
| Event | Có event | Có event |
| sizeof | Không dùng được (unsafe mới được) | Dùng được trong unsafe context |
Khi nào dùng Struct?
- Kiểu dữ liệu nhỏ, đơn giản (Point, Rectangle, Color, DateTime...).
- Cần hiệu năng cao, tránh GC pressure (allocation trên stack).
- Bất biến (immutable) - struct nên thiết kế immutable.
- Số lượng instance lớn (array của struct liền móc bộ nhớ).
Khi nào dùng Class?
- Đối tượng phức tạp, có identity, lifecycle quản lý.
- Cần kế thừa, polymorphism.
- Reference semantics (chia sẻ state).
- Cần nullability.