Nullable type là kiểu dữ liệu cho phép value type nhận thêm giá trị null, ví dụ int? age = null;. Bên dưới nó là struct Nullable<T> bọc value type lại, nên int? thực chất là Nullable<int>.
Hãy nghĩ như một ô input có checkbox "không có dữ liệu": giá trị có thể là số, hoặc trạng thái "không có" — khác với số 0. Điều này quan trọng vì value type như int, bool, DateTime mặc định không thể là null; nếu bạn cần biểu diễn "chưa có", nullable là cách chuẩn.
Cơ chế hoạt động: Nullable<T> có hai thành phần chính — HasValue (kiểm tra có giá trị hay không) và Value (lấy giá trị thật). Khi HasValue == false, truy cập Value sẽ ném InvalidOperationException. C# cung cấp cú pháp T? cho mọi value type, và các toán tử như ?? để cung cấp giá trị mặc định: int actualAge = age ?? 0;. Ngoài ra, nullable còn hỗ trợ ?. (null-conditional) khi truy cập thành viên.
Ví dụ:
int? age = null;
if (age.HasValue)
{
Console.WriteLine($"Age: {age.Value}");
}
else
{
Console.WriteLine("Age not provided");
}
int displayAge = age ?? 0; // 0 khi nullLỗi thường gặp: dùng Nullable<T> cho reference type — không cần, vì reference type đã nullable sẵn. Trong C# 8+, reference type có nullable annotation (string?) nhưng đó là cảnh báo compile-time, không phải wrapper runtime như Nullable<T>. Cũng đừng nhầm int? với int mặc định 0; nếu database trả về NULL, ép sang int sẽ lỗi.
Lưu ý: Chỉ dùng nullable khi "vắng mặt" là trạng thái hợp lệ, không phải để tránh lỗi. Nếu giá trị luôn phải có, hãy để kiểu không nullable và xử lý lỗi rõ ràng.