null và nullable
Nội dung bài · 6 mục
Bạn tìm khách hàng theo số điện thoại, nhưng chưa có khách nào dùng số đó nên
kết quả là không có ai. C# dùng null để diễn tả "không có gì", và null
cũng là nguồn gây lỗi phổ biến nhất khi chương trình chạy.
Khái niệm
🕳️ null: giá trị cho biết biến không trỏ tới object nào.
❓ Nullable: kiểu có dấu ? phía sau, như int? hay Customer?, cho biết biến được phép mang giá trị null.
Field hoặc phần tử array kiểu reference type chưa gán thì mặc định là null,
còn biến khai báo trong method thì phải gán trước khi dùng. Value type như
int thì không nhận null, trừ khi viết thành int?.
Ví dụ
Customer? found = FindByPhone("0900000000");
if (found != null)
{
Console.WriteLine(found.Name);
}
else
{
Console.WriteLine("Không tìm thấy");
}
Customer? FindByPhone(string phone)
{
return null; // giả sử không có ai
}
class Customer
{
public string Name { get; set; } = "";
}Customer?báo cho người đọc và cho compiler: kết quả có thể lànull.- Luôn kiểm tra
!= nulltrước khi dùng một biến nullable. - Project .NET mới bật sẵn chế độ kiểm tra null. Dùng biến có thể
nullmà chưa kiểm tra thì compiler hiện cảnh báo.
Hai toán tử ?. và ??
Hai toán tử giúp viết phần kiểm tra null ngắn hơn:
string? note = null;
int? discount = null;
int length = note?.Length ?? 0;
int percent = discount ?? 0;
Console.WriteLine(length); // 0
Console.WriteLine(percent); // 0note?.Length: nếunotelànullthì cả biểu thức lànull, không gọi.Length.a ?? b: nếualànullthì lấyb.
Thử ngay
Dán vào Program.cs rồi chạy dotnet run:
string? coupon = null;
Console.WriteLine(coupon?.ToUpper() ?? "Không có mã");
coupon = "sale10";
Console.WriteLine(coupon?.ToUpper() ?? "Không có mã");Đoán trước khi chạy: lần in đầu tiên có bị lỗi vì gọi ToUpper() trên
null không?
Xem kết quả
Không có mã
SALE10Không lỗi. ?. thấy coupon là null nên bỏ qua ToUpper(), rồi ?? thay
bằng "Không có mã".
Lỗi hay gặp
Dùng biến null mà không kiểm tra. Chương trình dừng với
NullReferenceException.
// SAI — lỗi khi chạy: note đang là null
string? note = null;
Console.WriteLine(note.Length);// ĐÚNG
string? note = null;
Console.WriteLine(note?.Length ?? 0);Gán null cho value type. int luôn phải có một con số.
// SAI — lỗi compile: int không nhận null
int stock = null;// ĐÚNG — int? cho phép "chưa biết"
int? stock = null;Tóm tắt
nullnghĩa là không trỏ tới object nào.- Thêm
?sau kiểu (int?,string?) để cho phépnull. - Kiểm tra
!= nulltrước khi dùng, hoặc dùng?.và??. - Gọi thành viên trên
nullgâyNullReferenceException.
Tự kiểm tra
0/3 câuint? points = null; int total = points ?? 10; Giá trị của total là gì?
Chương trình dừng với NullReferenceException ở dòng customer.Name.ToUpper(). Nguyên nhân nhiều khả năng nhất là gì?
Khai báo nào hợp lệ?