# C# - Nullables

Xin chào, các bạn đang học lập trình! Hôm nay, chúng ta sẽ cùng khám phá thế giới kỳ diệu của Nullables trong C#. Đừng lo lắng nếu bạn là người mới bắt đầu học lập trình - tôi sẽ hướng dẫn bạn từng bước qua khái niệm này, giống như tôi đã làm với hàng trăm học viên trong những năm dạy học của mình. Hãy cùng bắt đầu hành trình thú vị này nhé!

## Nullables là gì?

Hãy tưởng tượng bạn đang điền một biểu mẫu, và có một mục cho tên đệm của bạn. Nhưng nếu bạn không có tên đệm thì sao? Trong thế giới thực, bạn sẽ để nó trống. Trong C#, chúng ta có một khái niệm tương tự gọi là Nullables.

Nullables là một tính năng đặc biệt trong C# cho phép các kiểu giá trị (như int, double, bool) có thêm một trạng thái: null. Thường thì các kiểu giá trị không thể là null, nhưng Nullables mang lại sự linh hoạt này cho chúng ta.

### Cú pháp cơ bản

Để khai báo một kiểu Nullables, chúng ta sử dụng ký hiệu `?` sau tên kiểu. Dưới đây là một ví dụ:

```csharp
int? nullableInt = null;
double? nullableDouble = 3.14;
bool? nullableBool = true;

Trong đoạn mã này:

C# -  Nullables

  • nullableInt là một số nguyên có thể là null, và chúng ta đã đặt nó là null.
  • nullableDouble là một số thực có thể là null, nhưng chúng ta đã给它 một giá trị.
  • nullableBool là một boolean có thể là null, và chúng ta đã đặt nó là true.

Kiểm tra null

Khi làm việc với Nullables, rất quan trọng là phải kiểm tra xem chúng có giá trị trước khi sử dụng. Chúng ta có thể làm điều này bằng cách sử dụng thuộc tính HasValue:

int? maybeNumber = null;

if (maybeNumber.HasValue)
{
    Console.WriteLine($"The value is: {maybeNumber.Value}");
}
else
{
    Console.WriteLine("The value is null");
}

Đoạn mã này kiểm tra xem maybeNumber có giá trị hay không. Nếu có, chúng ta in giá trị ra; nếu không, chúng ta nói rằng nó là null.

Sử dụng giá trị Nullables

Để sử dụng giá trị của một Nullables, chúng ta có thể truy cập thuộc tính Value. Tuy nhiên, chúng ta cần phải cẩn thận! Nếu chúng ta cố truy cập Value của một Nullables null, chúng ta sẽ gặp ngoại lệ. Dưới đây là một cách an toàn để làm điều này:

int? possibleAge = 25;

int actualAge = possibleAge ?? 0;

Console.WriteLine($"Age: {actualAge}");

Trong ví dụ này, nếu possibleAge là null, actualAge sẽ được đặt là 0. Điều này dẫn chúng ta đến chủ đề tiếp theo...

Оператор đồng nhất null (??)

Operatör Null Coalescing (??) giống như một người bảo vệ thân thiện giúp chúng ta đối phó với các giá trị null tiềm ẩn. Đây là một cách viết tắt để nói "Sử dụng giá trị này nếu nó không null, nếu không thì sử dụng giá trị dự phòng này."

Cách sử dụng cơ bản

Dưới đây là cách chúng ta sử dụng оператор đồng nhất null:

string name = null;
string displayName = name ?? "Guest";

Console.WriteLine($"Welcome, {displayName}!");

Trong đoạn mã này, nếu name là null (và nó là), displayName sẽ được đặt là "Guest". Đây là một cách ngắn gọn để cung cấp các giá trị mặc định.

Kết hợp оператор đồng nhất null

Chúng ta có thể kết hợp nhiều оператор đồng nhất null để kiểm tra nhiều giá trị tiềm ẩn:

string firstName = null;
string middleName = null;
string lastName = "Smith";

string fullName = firstName ?? middleName ?? lastName ?? "Unknown";

Console.WriteLine($"Full name: {fullName}");

Đoạn mã này sẽ sử dụng giá trị đầu tiên không phải null mà nó tìm thấy, hoặc "Unknown" nếu tất cả đều là null.

Sử dụng оператор đồng nhất null với các phương thức gọi

Operatör Null Coalescing cũng có thể được sử dụng với các phương thức gọi:

public string GetUserName()
{
    // Hãy tưởng tượng rằng phương thức này có thể trả về null
    return null;
}

string userName = GetUserName() ?? "DefaultUser";
Console.WriteLine($"User: {userName}");

Điều này đặc biệt hữu ích khi làm việc với các phương thức có thể trả về null.

Ví dụ thực tế

Hãy xem một số tình huống thực tế nơi Nullables và оператор đồng nhất null rất hữu ích:

Ví dụ 1: Đầu vào người dùng

Console.Write("Enter your age (or press Enter to skip): ");
string input = Console.ReadLine();

int? age = string.IsNullOrEmpty(input) ? null : int.Parse(input);

string message = age.HasValue 
    ? $"You are {age.Value} years old."
    : "Age not provided.";

Console.WriteLine(message);

Đoạn mã này cho phép người dùng nhập tuổi hoặc bỏ qua câu hỏi. Chúng ta sử dụng một Nullables int để đại diện cho tuổi, có thể hoặc không được cung cấp.

Ví dụ 2: Truy vấn cơ sở dữ liệu

Hãy tưởng tượng chúng ta đang truy vấn thông tin người dùng từ cơ sở dữ liệu:

public class User
{
    public string Name { get; set; }
    public int? Age { get; set; }
}

User user = GetUserFromDatabase(); // Giả sử phương thức này tồn tại

string ageDisplay = user.Age.HasValue 
    ? $"{user.Age.Value} years old" 
    : "Age unknown";

Console.WriteLine($"User: {user.Name ?? "Anonymous"}, {ageDisplay}");

Trong ví dụ này, chúng ta sử dụng Nullables để xử lý khả năng tuổi của người dùng có thể không có trong cơ sở dữ liệu, và chúng ta sử dụng оператор đồng nhất null để cung cấp tên mặc định nếu không có.

Kết luận

Nullables và оператор đồng nhất null là những công cụ mạnh mẽ trong C# giúp chúng ta viết mã linh hoạt và vững chắc hơn. Chúng cho phép chúng ta xử lý các tình huống dữ liệu có thể bị thiếu, làm cho các chương trình của chúng ta trở nên bền vững và thân thiện hơn với người dùng.

Nhớ rằng, lập trình giống như nấu ăn - nó cần sự thực hành để làm đúng. Đừng ngại thử nghiệm các khái niệm này trong các dự án của riêng bạn. Trước khi bạn biết điều gì, bạn sẽ sử dụng Nullables và ?? như một chuyên gia!

Tiếp tục lập trình, tiếp tục học hỏi, và quan trọng nhất, hãy vui vẻ trên hành trình lập trình của bạn!

Credits: Image by storyset