VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
C# CoreClass cơ bản
Bài 13/19
5 phút

null và nullable

Nội dung bài · 6 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Hai toán tử ?. và ??
  4. 4.Thử ngay
  5. 5.Lỗi hay gặp
  6. 6.Tóm tắt

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 != null trướ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ể null mà 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);   // 0
  • note?.Length: nếu note là null thì cả biểu thức là null, không gọi .Length.
  • a ?? b: nếu a là null thì lấy b.

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ã
SALE10

Khô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

  • null nghĩa là không trỏ tới object nào.
  • Thêm ? sau kiểu (int?, string?) để cho phép null.
  • Kiểm tra != null trước khi dùng, hoặc dùng ?. và ??.
  • Gọi thành viên trên null gây NullReferenceException.

Tự kiểm tra

0/3 câu
Câu 1

int? points = null; int total = points ?? 10; Giá trị của total là gì?

Câu 2

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ì?

Câu 3

Khai báo nào hợp lệ?

Value type và reference typestatic

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Hai toán tử ?. và ??
  4. 4.Thử ngay
  5. 5.Lỗi hay gặp
  6. 6.Tóm tắt