跳過到頁腳內容
.NET幫助

C#可空類型(對開發者如何理解的工作)

在使用C#時,您經常需要處理null值,特別是在引用類型中。C#中的可空類型提供了一種表示未定義或不存在的值的方法。此指南涵蓋了C#可空類型的基本要素,它們的實際用途,以及在不同場景下的運作方式。 我們還將在文章中稍後探討<IronPDF。

C#中的可空類型

默認情況下,C#中的值類型(例如,int、bool、DateTime)無法被賦予null值。 為了解決這一限制,C#引入了可空值類型,允許您為值類型賦予null值。當您需要表示沒有有效值的情況時,可空類型特別有用。

聲明可空類型

在C#中聲明可空類型,您可以使用以下語法:

// Declare a nullable integer
int? nullableInt = null;
// Declare a nullable integer
int? nullableInt = null;
' Declare a nullable integer
Dim nullableInt? As Integer = Nothing
$vbLabelText   $csharpLabel

這裡,int?Nullable<int>的簡寫。 nullableInt變量可以容納int值或null。

檢查null

要檢查可空類型變量是否有值,您可以使用HasValue屬性或直接將變量與null比較,如下所示:

if (nullableInt.HasValue)
{
    // If nullableInt has a value, print it
    Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
    // If nullableInt does not have a value, print a message
    Console.WriteLine("No value assigned.");
}
if (nullableInt.HasValue)
{
    // If nullableInt has a value, print it
    Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
    // If nullableInt does not have a value, print a message
    Console.WriteLine("No value assigned.");
}
If nullableInt.HasValue Then
	' If nullableInt has a value, print it
	Console.WriteLine("Value: " & nullableInt.Value)
Else
	' If nullableInt does not have a value, print a message
	Console.WriteLine("No value assigned.")
End If
$vbLabelText   $csharpLabel

或者,您可以使用null合併運算符(??)來提供可空類型為null時的默認值:

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

如果nullableInt為null,result將被賦值為默認值0。

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

在C#中,值類型(例如int、bool和double)與引用類型(例如string、object)不同。 可空值類型允許值類型表示null,而可空引用類型允許引用類型默認為不可空,從而減少null引用異常的風險。

可空值類型

可空值類型允許值類型接受null值。 要聲明可空值類型,請將問號?附加到數據類型上:

// Declare a nullable double
double? nullableDouble = null;
// Declare a nullable double
double? nullableDouble = null;
' Declare a nullable double
Dim nullableDouble? As Double = Nothing
$vbLabelText   $csharpLabel

在此示例中,nullableDouble可以容納double值或null。

可空引用類型

C# 8.0引入了可空引用類型。您可以在項目級別啟用可空引用類型,或者在代碼文件的開頭添加#nullable enable指令。啟用可空引用類型後,引用類型必須顯式標記為可空,使用?,有助於避免因null引用導致的潛在運行時異常。

#nullable enable
// Declare a nullable string
string? nullableString = null;
#nullable enable
// Declare a nullable string
string? nullableString = null;
'INSTANT VB TODO TASK: There is no equivalent to #nullable in VB:
'#nullable enable
' Declare a nullable string
'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>
<Nullable>enable</Nullable>
XML

啟用後,編譯器將默認將引用類型視為不可空。 此功能特別有助於在編譯期而非運行時捕捉null引用問題。

實際案例

讓我們探討一些實際的例子,以加深您對可空類型的理解。

範例1:可空類型與值類型

在此示例中,我們將使用具有int的可空類型:

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

這裡,nullableInt是一個int類型的可空類型變量。 如果nullableInt為null,b將因null合併運算符而獲得值10。 否則,b將取nullableInt的值。

範例2:可空引用類型

現在,讓我們來看看可空引用類型如何工作:

#nullable enable
class Program
{
    static void Main()
    {
        string? nullableString = null;
        string nonNullableString = "Hello";
        // Use null coalescing operator to provide a default value for length
        Console.WriteLine(nullableString?.Length ?? 0);
        Console.WriteLine(nonNullableString.Length);
    }
}
#nullable enable
class Program
{
    static void Main()
    {
        string? nullableString = null;
        string nonNullableString = "Hello";
        // Use null coalescing operator to provide a default value for length
        Console.WriteLine(nullableString?.Length ?? 0);
        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"
		' Use null coalescing operator to provide a default value for length
		Console.WriteLine(If(nullableString?.Length, 0))
		Console.WriteLine(nonNullableString.Length)
	End Sub
End Class
$vbLabelText   $csharpLabel

在上面的代碼中,nullableString可以為null,null合併運算符確保如果它為null,字符串的長度默認為0。

範例3:嵌套可空類型

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

// Redundant, but syntactically valid
int? nestedNullableInt = null;
// Redundant, but syntactically valid
int? nestedNullableInt = null;
' Redundant, but syntactically valid
Dim nestedNullableInt? As Integer = Nothing
$vbLabelText   $csharpLabel

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

null合併運算符(??)

null合併運算符(??)經常與可空類型一起使用,以便在可空類型為null時提供默認值。 此運算符通過避免顯式的if-else檢查來簡化代碼。

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

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

編譯時錯誤和可空類型

啟用可空引用類型後,當C#檢測到潛在的null分配問題時,會在編譯時生成警告和錯誤。 這些編譯時錯誤有助於及早發現問題,使您的代碼更加健壯。

在此示例中,IronPDF用於將HTML內容呈現為PDF文檔,然後保存到指定位置。

string? nullableString = null;
// This will produce a compiler warning because nullableString may be null
string nonNullableString = nullableString;
string? nullableString = null;
// This will produce a compiler warning because nullableString may be null
string nonNullableString = nullableString;
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
Dim nullableString As String = Nothing
' This will produce a compiler warning because nullableString may be null
Dim nonNullableString As String = nullableString
$vbLabelText   $csharpLabel

在此情況下,將nullableString分配給nonNullableString會產生編譯器警告,因為nullableString可能為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 for optional income
        string? clientName = "Iron Dev";  // Nullable reference type for client name
        var renderer = new ChromePdfRenderer();
        string htmlContent = $@"
            <h1>Financial Report</h1>
            <p>Client Name: {clientName ?? "Unknown"}</p>
            <p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
        // Render the HTML to a PDF
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        // Save the PDF to disk
        pdf.SaveAs("FinancialReport.pdf");
        Console.WriteLine("PDF Generated Successfully.");
    }
}
using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        int? optionalIncome = null;  // Nullable type for optional income
        string? clientName = "Iron Dev";  // Nullable reference type for client name
        var renderer = new ChromePdfRenderer();
        string htmlContent = $@"
            <h1>Financial Report</h1>
            <p>Client Name: {clientName ?? "Unknown"}</p>
            <p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
        // Render the HTML to a PDF
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        // Save the PDF to disk
        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 for optional income
'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 for client name
		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>"
		' Render the HTML to a PDF
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
		' Save the PDF to disk
		pdf.SaveAs("FinancialReport.pdf")
		Console.WriteLine("PDF Generated Successfully.")
	End Sub
End Class
$vbLabelText   $csharpLabel

C#可空類型(對開發者的工作方式):圖2 - 示例代碼輸出

在此代碼中,可空類型(int?string?)用於安全地處理遺漏數據。 null合併運算符(??)確保如果有任何數據缺失,在PDF中使用默認值。

結論

C#可空類型(對開發者的工作方式):圖3 - IronPDF許可頁面

C#中的可空類型是一個強大的工具,用於處理值類型和引用類型中的null值。通過使用可空類型,您可以避免null引用異常並提高代碼的健壯性。 記得在新項目中啟用可空引用類型,以利用編譯時錯誤檢查的好處,並在處理可空類型時使用 null 合併運算符 (??) 簡化您的代碼。

IronPDF提供免費試用,以幫助您在做出承諾之前探索它的功能。 事先無需任何費用,您可以測試水溫,看看它如何融入您的開發過程。 一旦您準備好了,許可證的起價為$799。

常見問題解答

如何在動態 PDF 生成中利用可空類型?

可空類型在動態 PDF 生成中可以至關重要,可以通過像 IronPDF 這樣的庫安全地表示可選字段。這確保了缺失的數據得到了適當處理,必要時提供了默認值。

在 C# 中聲明可空類型的語法是什麼?

在 C# 中,你可以通過在數據類型後附加一個問號 '?' 來聲明一個可空類型。例如,要聲明一個可空整數,你可以寫int? nullableInt = null;.

C# 中的可空類型會影響生成報告的健壯性嗎?

是的,使用可空類型可以增強生成報告的健壯性,確保可選字段的值缺失時不會引發錯誤。像 IronPDF 這樣的庫可以有效地利用可空類型來管理這些條件。

可空引用類型如何幫助防止運行時錯誤?

在 C# 8.0 中引入的可空引用類型允許引用類型默認為不可空,從而幫助防止運行時錯誤。這減少了空引用異常的風險,並允許在編譯過程中提前檢測潛在問題。

空合併運算符在管理可空類型中扮演什麼角色?

空合併運算符??用於管理可空類型,當可空類型為空時提供默認值。它簡化了代碼並有助於避免顯式的 if-else 檢查。

如何在 C# 中檢查可空類型是否有值?

在 C# 中,你可以使用HasValue屬性來檢查可空類型是否有值,或者直接將變量與 null 進行比較。

在 C# 應用中使用可空類型的一些典型場景是什麼?

可空類型通常用於數據可能不完整或可選的情境中,例如表單輸入、配置設置,或是在允許空值的數據庫接口中。它們在使用像 IronPDF 這樣的庫進行動態報告生成中特別有用。

啟用可空引用類型對 C# 專案的編譯有何影響?

在 C# 專案中啟用可空引用類型會對潛在的空引用問題發出編譯時警告和錯誤,從而提前捕獲問題並促進更健壯的代碼開發。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。