C# - 可空類型 (Nullables)

您好,有志於编程的同学们!今天,我們將要深入探讨C#中令人著迷的可空類型 (Nullables) 這個概念。如果你是编程新手,不必擔心——我會一步步引導你了解這個概念,就像我過去幾年來為無數學生做的那樣。讓我們一起踏上這次令人興奮的旅程吧!

C# -  Nullables

什麼是可空類型?

想像你正在填寫一個表單,裡面有一個字段是你的中間名。但如果你没有中間名呢?在現實世界中,你可能會留它空白。在C#中,我們有個類似的概念,叫做可空類型。

可空類型是C#中的一個特殊功能,它允許值類型(如int、double、bool)具有一個額外的狀態:null。通常,值類型不能為null,但可空類型給我們提供了這種靈活性。

基本語法

要聲明一個可空類型,我們在類型名後面使用 ? 符號。以下是一個例子:

int? 可空整數 = null;
double? 可空雙精度 = 3.14;
bool? 可空布爾 = true;

在這段代碼中:

  • 可空整數 是一個可以是null的整數,我們將它設置為null。
  • 可空雙精度 是一個可以是null的雙精度數,但我們給它賦了一個值。
  • 可空布爾 是一個可以是null的布爾值,我們將它設置為true。

檢查null值

當使用可空類型時,在使用之前檢查它們是否有值是關鍵的。我們可以使用 HasValue 屬性來做這件事:

int? 也許有數字 = null;

if (也許有數字.HasValue)
{
Console.WriteLine($"數值是: {也許有數字.Value}");
}
else
{
Console.WriteLine("數值是null");
}

這段代碼檢查 也許有數字 是否有值。如果有,我們打印出該值;否則,我們說它為null。

使用可空值

要使用可空類型的值,我們可以訪問它的 Value 屬性。但我們必須小心!如果我們嘗試訪問null可空類型的 Value,我們將會得到一個異常。以下是一個安全的做法:

int? 可能有年齡 = 25;

int 實際年齡 = 可能有年齡 ?? 0;

Console.WriteLine($"年齡: {實際年齡}");

在這個例子中,如果 可能有年齡 為null,實際年齡 將被設置為0。這引出了我們下一個話題...

空合取運算符 (??)

空合取運算符 (??) 就像一個友好的守護者,幫助我們處理可能的null值。它是一種簡潔的方式,表示“如果這個值不是null,則使用這個值,否則使用這個 fallback 值。”

基本使用方法

以下是我們如何使用空合取運算符:

string 名字 = null;
string 顯示名稱 = 名字 ?? "訪客";

Console.WriteLine($"歡迎,{顯示名稱}!");

在這段代碼中,如果 名字 為null(它的確是),顯示名稱 將被設置為 "訪客"。這是一種提供默認值的簡潔方式。

鍊接空合取運算符

我們可以串接多個 ?? 運算符來檢查多個可能的值:

string 名字 = null;
string 中間名 = null;
string 姓氏 = "Smith";

string 全名 = 名字 ?? 中間名 ?? 姓氏 ?? "未知";

Console.WriteLine($"全名: {全名}");

這段代碼將使用它找到的第一個非null值,或者如果全部都是null,則使用 "未知"。

空合取與方法調用

?? 運算符也可以與方法調用一起使用:

public string GetUserName()
{
// 想像這個方法可能會返回null
return null;
}

string 用戶名 = GetUserName() ?? "默認用戶";
Console.WriteLine($"用戶: {用戶名}");

這在處理可能返回null的方法時特別有用。

實際例子

讓我們看看一些可空類型和空合取運算符在現實世界中的應用場景:

示例 1:用戶輸入

Console.Write("輸入你的年齡(或者直接按Enter鍵跳過):");
string 輸入 = Console.ReadLine();

int? 年齡 = string.IsNullOrEmpty(輸入) ? null : int.Parse(輸入);

string 消息 = 年齡.HasValue
? $"你今年{年齡.Value}歲。"
: "未提供年齡。";

Console.WriteLine(消息);

這段代碼允許用戶輸入他們的年齡或者跳過這個問題。我們使用可空int來表示年齡,可能或不被提供。

示例 2:數據庫查詢

想像我們正在查詢數據庫以獲取用戶信息:

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

User 用戶 = GetUserFromDatabase(); // 假設這個方法存在

string 年齡顯示 = 用戶.Age.HasValue
? $"{用戶.Age.Value}歲"
: "年齡未知";

Console.WriteLine($"用戶: {用戶.Name ?? "匿名"}, {年齡顯示}");

在這個例子中,我們使用可空類型來處理用戶年齡可能不在數據庫中的情況,並使用空合取運算符來提供一個默認名稱如果它不可用。

結論

可空類型和空合取運算符是C#中強大的工具,它們幫助我們編寫更健壯、更靈活的代碼。它們讓我們能夠處理數據可能缺失的情況,使我們的程序更加堅固和用戶友好。

記住,編程就像烹飪一樣——實踐是達到完美的關鍵。不要害怕在您自己的項目中嘗試這些概念。在你意識到之前,你將會像專家一樣使用可空類型和空合取運算符!

持續編碼,持續學習,最重要的是,在你們的编程旅程上玩得開心!

方法/運算符 描述 示例
? (可空類型聲明) 聲明一個值類型為可空 int? 可空整數 = null;
HasValue 檢查一個可空是否有值 if (可空整數.HasValue) { ... }
Value 存取可空的值 int 值 = 可空整數.Value;
?? (空合取運算符) 為null提供默認值 int 結果 = 可空整數 ?? 0;
GetValueOrDefault() 返回值或null時的默認值 int 值 = 可空整數.GetValueOrDefault();
GetValueOrDefault(T defaultValue) 返回值或指定的默認值 int 值 = 可空整數.GetValueOrDefault(10);

Credits: Image by storyset