.NET 幫助

C# 可空類型 (開發者如何使用)

Chipego
奇佩戈·卡林达
2024年10月24日
分享:

在使用 C# 時,您經常需要處理空值,尤其是引用型別。C# 中的可空型別提供了一種方法,用於表示值型別的未定義或缺失值。本指引涵蓋 C# 可空型別的基本要點、其實際用途以及它們在不同情境下的運作方式。 在本文稍後,我們也會探索IronPDF

C#中的可空類型

預設情況下,C# 中的值類型(例如:int、bool、DateTime)不能被賦予 null 值。 為了解決這個限制,C# 引入了可空值類型,允許您將 null 賦給值類型。當您需要表示缺少有效值時,可空類型特別有用。

宣告可空類型

要在 C# 中宣告可空類型,您可以使用以下語法:

// Nullable type variable value
int? nullableInt = null;
// Nullable type variable value
int? nullableInt = null;
' Nullable type variable value
Dim nullableInt? As Integer = Nothing
$vbLabelText   $csharpLabel

這裡, int? 是 Nullable的簡寫。 nullableInt 變數可以保存 int 值或 null。

檢查是否為空

要檢查可空類型變數是否有值,可以使用 HasValue 屬性或直接將變數與 null 進行比較。 例如:

if (nullableInt.HasValue)
{
    Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
    Console.WriteLine("No value assigned.");
}
if (nullableInt.HasValue)
{
    Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
    Console.WriteLine("No value assigned.");
}
If nullableInt.HasValue Then
	Console.WriteLine("Value: " & nullableInt.Value)
Else
	Console.WriteLine("No value assigned.")
End If
$vbLabelText   $csharpLabel

或者,您可以使用空合併運算子(??)在可為空類型為空時提供預設值:

int result = nullableInt ?? 0;
Console.WriteLine("Result: " + result);
int result = nullableInt ?? 0;
Console.WriteLine("Result: " + result);
Dim result As Integer = If(nullableInt, 0)
Console.WriteLine("Result: " & result)
$vbLabelText   $csharpLabel

如果 nullableInt 為 null,結果將被賦予預設值 0。

可空值類型與可空引用類型

在 C# 中,值類型(例如 int、bool 和 double)與參考類型(如 string、object)有所不同。 可空值類型允許值類型表示null,而可空參考類型則預設讓引用類型不可為null,從而降低空引用異常的風險。

可空值類型

可空值類型允許值類型接受空值。 要宣告可空值類型,請在結尾附加一個問號 ? 至資料類型:

double? nullableDouble = null;
double? nullableDouble = null;
Dim nullableDouble? As Double = Nothing
$vbLabelText   $csharpLabel

在此範例中,nullableDouble 可以持有一個 double 值或 null。

可空引用類型

可空引用類型在C# 8.0中引入。您可以在專案層級啟用可空引用類型,或在程式碼文件的開頭加入#nullable enable指令啟用該功能。在啟用了可空引用類型後,引用類型必須顯式標記為可空型別(使用?),這有助於避免由空引用引起的潛在運行時異常。

#nullable enable
string? nullableString = null;
#nullable enable
string? nullableString = null;
'INSTANT VB TODO TASK: There is no equivalent to #nullable in VB:
'#nullable enable
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
Dim nullableString As String = Nothing
$vbLabelText   $csharpLabel

在這裡,nullableString 允許為空。 如果您宣告一個非可空引用型別而不使用 ?,編譯器在偵測到可能的 null 指派時會產生警告。

啟用可為 Null 的引用類型

要在項目中全局啟用可空引用類型,請在您的 .csproj 文件中添加以下行:

<Nullable>enable</Nullable>
XML

啟用後,編譯器將默認將引用類型視為不可空。 此功能特別方便在編譯時捕捉空參考問題,而不是在運行時。

實用範例

讓我們探索一些實際範例來鞏固您對可空類型的理解。

範例 1:具有值類型的可空類型

在此範例中,我們將使用可空類型與 int:

class Program
{
    static void Main(string[] args)
    {
        int? nullableInt = null;
        int b = nullableInt ?? 10; // Use null coalescing operator
        Console.WriteLine("b: " + b);
        if (nullableInt.HasValue)
        {
            Console.WriteLine("nullableInt has value: " + nullableInt.Value);
        }
        else
        {
            Console.WriteLine("nullableInt is null");
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        int? nullableInt = null;
        int b = nullableInt ?? 10; // Use null coalescing operator
        Console.WriteLine("b: " + b);
        if (nullableInt.HasValue)
        {
            Console.WriteLine("nullableInt has value: " + nullableInt.Value);
        }
        else
        {
            Console.WriteLine("nullableInt is null");
        }
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim nullableInt? As Integer = Nothing
		Dim b As Integer = If(nullableInt, 10) ' Use null coalescing operator
		Console.WriteLine("b: " & b)
		If nullableInt.HasValue Then
			Console.WriteLine("nullableInt has value: " & nullableInt.Value)
		Else
			Console.WriteLine("nullableInt is null")
		End If
	End Sub
End Class
$vbLabelText   $csharpLabel

在此,nullableInt 是一個 int 的可空類型變數。 如果 nullableInt 為 null,則由於使用空合併運算子,b 將獲得值 10。 否則,b 將取 nullableInt 的值。

範例 2:可空參考型別

現在,我們來看看可為 null 的參考類型如何運作:

#nullable enable
class Program
{
    static void Main()
    {
        string? nullableString = null;
        string nonNullableString = "Hello";
        Console.WriteLine(nullableString?.Length ?? 0); // Use null coalescing operator
        Console.WriteLine(nonNullableString.Length);
    }
}
#nullable enable
class Program
{
    static void Main()
    {
        string? nullableString = null;
        string nonNullableString = "Hello";
        Console.WriteLine(nullableString?.Length ?? 0); // Use null coalescing operator
        Console.WriteLine(nonNullableString.Length);
    }
}
'INSTANT VB TODO TASK: There is no equivalent to #nullable in VB:
'#nullable enable
Friend Class Program
	Shared Sub Main()
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
		Dim nullableString As String = Nothing
		Dim nonNullableString As String = "Hello"
		Console.WriteLine(If(nullableString?.Length, 0)) ' Use null coalescing operator
		Console.WriteLine(nonNullableString.Length)
	End Sub
End Class
$vbLabelText   $csharpLabel

在上述程式碼中,nullableString 可以是 null,而空合併運算子確保如果它是 null,則字串的長度預設為 0。

範例 3:嵌套可空類型

C#允許您聲明嵌套的可空類型。例如:

int?? nestedNullableInt = null;
int?? nestedNullableInt = null;
If(Integer, nestedNullableInt) = Nothing
$vbLabelText   $csharpLabel

雖然巢狀可空類型可能看似多餘,但在 C# 中它們在語法上是有效的。 然而,實際上,嵌套可空類型不提供任何額外功能且很少被使用。

空合併運算子 (??)

空合運算子 (??) 常與可空類型一起使用,當可空類型為 null 時提供默認值。 此運算子透過避免顯式的 if-else 檢查來簡化程式碼。

int? nullableValue = null;
int defaultValue = nullableValue ?? -1;
int? nullableValue = null;
int defaultValue = nullableValue ?? -1;
Dim nullableValue? As Integer = Nothing
Dim defaultValue As Integer = If(nullableValue, -1)
$vbLabelText   $csharpLabel

在此範例中,如果 nullableValue 為 null,則 defaultValue 將被指定為 -1。否則,defaultValue 將取 nullableValue 的值。

編譯時錯誤和可空類型

啟用可為 null 的引用類型後,C# 在編譯時會在偵測到可能的 null 賦值問題時產生警告和錯誤。 這些編譯時錯誤能夠幫助早期發現問題,使您的代碼更加健壯。

請考慮以下示例:

string? nullableString = null;
string nonNullableString = nullableString; // Compiler warning
string? nullableString = null;
string nonNullableString = nullableString; // Compiler warning
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
Dim nullableString As String = Nothing
Dim nonNullableString As String = nullableString ' Compiler warning
$vbLabelText   $csharpLabel

在這種情況下,將 nullableString 賦值給 nonNullableString 會產生編譯器警告,因為 nullableString 可能為 null,將它賦值給非 null 類型可能會導致運行時異常。

在 IronPDF 中使用可空類型

C# 可空類型(開發人員如何使用):圖 1 - IronPDF:C# PDF 庫

IronPDF 是一個 C# PDF 函式庫,旨在幫助開發人員直接從 .NET 應用程式創建、編輯和操作 PDF 文件。 您可以將 HTML 轉換為 PDF,生成報告,或甚至處理複雜的文件結構。

可空類型在動態報告生成情況中特別有用,例如在您為會計師生成財務數據不完整的 PDF 時。 藉由使用可空類型,您可以管理可選欄位、避免例外情況並提供預設值。

using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        int? optionalIncome = null;  // Nullable type
        string? clientName = "Iron Dev";  // Nullable reference type
        var renderer = new ChromePdfRenderer();
        string htmlContent = $@"
            <h1>Financial Report</h1>
            <p>Client Name: {clientName ?? "Unknown"}</p>
            <p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("FinancialReport.pdf");
        Console.WriteLine("PDF Generated Successfully.");
    }
}
using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        int? optionalIncome = null;  // Nullable type
        string? clientName = "Iron Dev";  // Nullable reference type
        var renderer = new ChromePdfRenderer();
        string htmlContent = $@"
            <h1>Financial Report</h1>
            <p>Client Name: {clientName ?? "Unknown"}</p>
            <p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("FinancialReport.pdf");
        Console.WriteLine("PDF Generated Successfully.");
    }
}
Imports IronPdf
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim optionalIncome? As Integer = Nothing ' Nullable type
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? clientName = "Iron Dev";
		Dim clientName As String = "Iron Dev" ' Nullable reference type
		Dim renderer = New ChromePdfRenderer()
		Dim htmlContent As String = $"
            <h1>Financial Report</h1>
            <p>Client Name: {If(clientName, "Unknown")}</p>ignoreignore<p>Income: {If(optionalIncome?.ToString(), "Data not available")}</p>"
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
		pdf.SaveAs("FinancialReport.pdf")
		Console.WriteLine("PDF Generated Successfully.")
	End Sub
End Class
$vbLabelText   $csharpLabel

C# 可空類型(對開發人員的運作方式):圖 2 - 範例代碼輸出

在此代碼中,可空類型(int? 和 string?) 用於安全處理遺漏數據。 空合併運算子(??)確保如果有任何資料遺失,PDF 中將使用預設值。

結論

C# 可空類型(開發人員如何使用):圖3 - IronPDF 授權頁面

C# 中的可空類型是處理值類型和引用類型的空值的強大工具。透過使用可空類型,您可以避免空引用異常並提高代碼的健壯性。 請記得在新專案中啟用可空的參考類型,以利用編譯時錯誤檢查的優勢,並在處理可空類型時使用空合併運算子(??)來簡化您的代碼。

IronPDF 提供免費試用,幫助您在做出承諾之前探索其功能。 您可以在不需要前期費用的情況下嘗試一下,看看它如何融入您的開發過程。 準備好繼續前進後,授權價格從$749開始。

Chipego
奇佩戈·卡林达
軟體工程師
Chipego 擁有天生的傾聽技能,這幫助他理解客戶問題,並提供智能解決方案。他在獲得信息技術理學學士學位後,于 2023 年加入 Iron Software 團隊。IronPDF 和 IronOCR 是 Chipego 專注的兩個產品,但隨著他每天找到新的方法來支持客戶,他對所有產品的了解也在不斷增長。他喜歡在 Iron Software 的協作生活,公司內的團隊成員從各自不同的經歷中共同努力,創造出有效的創新解決方案。當 Chipego 離開辦公桌時,他常常享受讀好書或踢足球的樂趣。
< 上一頁
C# ConfigureAwait(它如何為開發人員工作)
下一個 >
C# 命名規範(開發者如何使用)