1. Giới thiệu
Tại sao phải bật NRT riêng?
Nullable Reference Types (NRT) — không chỉ là cú pháp cho vui đâu, mà là trợ thủ đắc lực cho compiler trong việc xử lý lỗi liên quan đến null. Nhưng vì lý do lịch sử, chế độ này không được bật mặc định trong các project cũ — để không phá vỡ tương thích. Nếu bạn tạo project mới trên các bản .NET gần đây (ví dụ .NET 7, 8 hoặc 9), thì NRT thường đã được bật sẵn rồi. Nhưng nếu project cũ hoặc bạn muốn tự kiểm soát chế độ này, thì phải bật thủ công nhé.
Chế độ Nullable Reference Types làm gì?
Khi chế độ này bật, compiler sẽ phân tích xem biến tham chiếu nào có thể là null, còn biến nào thì không. Nó không can thiệp vào lúc chạy chương trình, nhưng sẽ cảnh báo bạn nếu thấy có nguy cơ lỗi. Đây là cách tuyệt vời để viết code chắc chắn, dễ hiểu và ổn định.
Làm sao biết NRT đã bật chưa?
Nếu bạn dùng project mới .NET 6 trở lên, khả năng cao là NRT đã bật rồi. Nhưng cứ kiểm tra cho chắc nhé!
- Mở file project. Thường là file có đuôi .csproj.
- Tìm hoặc thêm cài đặt <Nullable> bên trong thẻ <PropertyGroup> đầu tiên.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Nếu bạn thấy <Nullable>disable</Nullable> thì kiểm tra NRT đang tắt nhé.
2. Cách bật chế độ NRT
Qua .csproj — cho toàn bộ project
- Mở (hoặc tạo) file .csproj.
- Bên trong block <PropertyGroup> thêm hoặc sửa dòng này:
<Nullable>enable</Nullable>
Giờ compiler sẽ soi kỹ tất cả các file .cs trong project và cảnh báo nếu bạn truy cập null nguy hiểm.
Tại sao phải làm vậy?
Vì đây là cài đặt toàn cục. Từ giờ, cả project sẽ theo luật mới: null — luôn bị nghi ngờ, không còn chuyện lơ là nữa!
Chỉ cho file hoặc đoạn code riêng lẻ
Nếu bạn chưa sẵn sàng bật chế độ nghiêm ngặt cho cả project, có thể thử nghiệm trên từng file. Dùng directive preprocessor nhé:
#nullable enable
string? value = null; // Ở đây đã bật phân tích
#nullable disable
string legacyValue = null; // Ở đây thì chưa bật
#nullable restore
- #nullable enable — bật kiểm tra đến hết file.
- #nullable disable — tắt kiểm tra.
- #nullable restore — lấy lại cài đặt từ .csproj hoặc file ngoài.
Rất tiện: bạn có thể bật kiểm tra nghiêm ngặt ở module mới mà không ảnh hưởng code cũ, chưa ổn định.
Có thể chỉ định gì nữa trong <Nullable>
| Giá trị | Hành vi |
|---|---|
|
Bật tất cả: annotation và cảnh báo |
|
Tắt hoàn toàn phân tích null-reference |
|
Chỉ cảnh báo, không bắt buộc annotation |
|
Phải có annotation, nhưng compiler không cảnh báo |
|
Khôi phục hành vi gốc (ví dụ từ cài đặt toàn cục) |
Thường thì dùng enable hoặc disable là đủ.
3. Demo ví dụ
Trước khi bật NRT
// Chế độ cũ, NRT tắt
string s = null; // Không ai phàn nàn gì
Console.WriteLine(s.Length); // Nguy hiểm! Có thể bị NullReferenceException
Sau khi bật NRT
// Chế độ mới, NRT đã bật
string s = null; // Cảnh báo: có thể gán null
Console.WriteLine(s.Length); // Cảnh báo: có thể truy cập null
Giờ IDE sẽ gạch chân các vấn đề tiềm ẩn và compiler sẽ cảnh báo: Dereference of a possibly null reference. (CS8602)
Làm sao sửa?
string? s = null;
if (s != null)
{
Console.WriteLine(s.Length);
}
Như vậy bạn nói rõ: biến này có thể là null, và compiler sẽ hài lòng.
4. Làm gì nếu project viết "kiểu cũ"?
Nhiều project được viết thời mà null gần như có mặt ở mọi biến tham chiếu. Khi bật NRT, bạn như thuê một kiểm toán viên nghiêm khắc, sẽ báo mọi vấn đề tiềm ẩn.
Nếu cảnh báo quá nhiều thì sao?
Đừng hoảng — đây là không phải lỗi, chỉ là gợi ý thôi. Chương trình vẫn compile bình thường.
- Có thể chỉ bật NRT ở file mới.
- Dần dần dọn code: thêm ?, kiểm tra null, dùng ! (phần này nói sau).
- Nhớ nhé: càng cẩn thận với null thì càng ít rắc rối về sau.
Tương thích ngược và thư viện bên ngoài
- Bật NRT không thay đổi hành vi code khi chạy, chỉ thêm phân tích lúc compile thôi.
- Code cũ có thể sẽ ra nhiều cảnh báo ngay lập tức.
- Nếu bạn dùng thư viện không có annotation NRT, compiler sẽ cẩn thận và giả định mọi thứ đều có thể là null.
GO TO FULL VERSION