跳至页脚内容
.NET 帮助

C# 可空类型(开发者用法)

当使用C#时,你往往需要处理空值,尤其是引用类型。C#中的可空类型提供了一种对值类型表示未定义或缺失值的方法。本指南介绍了C#可空类型的重要性,它们的实际用途,以及如何在不同情况下工作。 我们将在文章后面探讨IronPDF

C#中的可空类型

默认情况下,C#(例如int、bool、DateTime)中的值类型不能被赋予空值。 为了解决这一限制,C#引入了可空值类型,允许你将空赋给值类型。当你需要表示缺失的有效值时,可空类型特别有用。

声明可空类型

要在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值或空值。

检查空值

要检查可空类型变量是否有值,你可以使用HasValue属性或直接与空值进行比较,如下所示:

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

或者,你可以使用空合并运算符(??)在可空类型为空时提供一个默认值:

// 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为空,result将被赋予默认值0。

可空值类型与可空引用类型

在C#中,值类型(如int、bool和double)与引用类型(如string,object)不同。 可空值类型允许值类型表示空值,而可空引用类型允许引用类型默认情况下不可为空,从而减少空引用异常的风险。

可空值类型

可空值类型允许一个值类型接受空值。 要声明可空值类型,在数据类型后加一个问号?

// 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值或空值。

可空引用类型

可空引用类型是在C# 8.0中引入的。你可以在项目级别启用可空引用类型,或者通过在代码文件的开头添加#nullable enable指令启用。启用可空引用类型后,必须显式标记引用类型为可空的?,以避免可能的由于空引用导致的运行时异常。

#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被允许为空。 如果你声明一个不带?的非可空引用类型,编译器将发出警告,如果检测到潜在空值赋值。

启用可空引用类型

要在项目中全局启用可空引用类型,向你的.csproj文件添加以下行:

<Nullable>enable</Nullable>
<Nullable>enable</Nullable>
XML

一旦启用,编译器将默认将引用类型视为不可为空。 该特性特别有助于在编译时捕捉空引用问题,而不是在运行时。

实用示例

让我们探索一些实用示例来巩固你对可空类型的理解。

示例 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为空,b由于空合并运算符将获得值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可以为空,并且空合并运算符确保如果为空,字符串的长度默认值为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#中它们是语法上有效的。 然而,在实践中,嵌套可空类型不提供任何额外功能,且很少使用。

空合并运算符(??)

空合并运算符(??)经常用于可空类型以在可空类型为空时提供默认值。 此运算符通过避免显式的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为空,defaultValue将被赋值为-1。否则,defaultValue将获取nullableValue的值。

编译时错误与可空类型

启用可空引用类型时,C#在编译时产生警告和错误,当它检测到潜在的空值赋值问题。 这些编译时错误有助于提前捕捉问题,使你的代码更为健壮。

在此示例中,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可能为空,并赋予给非可空类型可能导致运行时异常。

在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?)来安全地处理丢失的数据。 空合并运算符(??)确保如果任何数据缺失,将在PDF中使用默认值。

结论

C# 可空类型(开发者如何操作):图3 - IronPDF许可页面

C#中的可空类型是处理值类型和引用类型中空值的有力工具。通过使用可空类型,您可以避免空引用异常并提高代码的健壮性。 记得在新项目中启用可空引用类型以便从编译时错误检查中受益,并使用空合并运算符(??)以简化处理可空类型时的代码。

IronPDF提供一个免费试用以帮助你在做出承诺前探索其功能。 无需提前付费,你可以试水并看它如何适合你的开发过程。 一旦准备好继续,License起价为$799。

常见问题解答

可空类型如何在动态PDF生成中被利用?

可空类型在动态PDF生成中非常重要,因为它们允许安全地表示可选字段,使用像IronPDF这样的库。这确保了缺失数据被恰当地处理,并在需要时提供默认值。

在C#中声明可空类型的语法是什么?

在C#中,可以通过在数据类型后附加一个问号 '?' 来声明可空类型。例如,要声明一个可空整型,你可以写 int? nullableInt = null;

C#中的可空类型会影响生成报告的稳健性吗?

是的,使用可空类型可以增强生成报告的稳健性,确保当可选字段的值缺失时不会引发错误。像IronPDF这样的库可以利用可空类型来有效管理这些情况。

可空引用类型如何帮助防止运行时错误?

可空引用类型在C# 8.0中引入,允许引用类型默认不可为空,帮助防止运行时错误。这减少了空引用异常的风险,并在编译时允许及早检测潜在问题。

在管理可空类型时,空合并运算符的作用是什么?

在管理可空类型时,空合并运算符 ?? 提供默认值,当可空类型为空时,这简化了代码并避免显式的if-else检查。

如何在C#中检查可空类型是否有值?

可以通过使用 HasValue 属性或直接将变量与null进行比较来确定可空类型在C#中是否有值。

使用可空类型在C#应用程序中的典型场景是什么?

可空类型通常用于数据可能不完整或可选的情况,例如表单输入、配置设置,或在接口允许null值的数据库中。它们在动态报告生成中尤为有用,使用像IronPDF这样的库。

启用可空引用类型如何影响C#项目的编译?

在C#项目中启用可空引用类型会导致编译时警告和错误,以应对潜在的空引用问题,从而及早捕捉问题并促进更稳健的代码开发。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。