.NET 帮助

C# 可空类型(如何为开发人员工作)

Chipego
奇佩戈-卡琳达
2024年十月24日
分享:

在使用 C# 时,您经常需要处理空值,特别是引用类型。C# 中的可空类型提供了一种方法来表示值类型的未定义或缺失的值。本指南涵盖了 C# 可空类型的基本要点、其实际用途以及它们在不同场景下的工作方式。 我们稍后将在文章中探索IronPDF

C# 和 num 中的可空类型;

默认情况下,C#中的值类型(例如,int、bool、DateTime)不能被赋予空值。 为了解决这一限制,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

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

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 为空,结果将被分配为默认值 0。

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

在 C# 中,值类型(例如 int、bool 和 double)与引用类型(如 string、object)不同。 可空值类型允许值类型表示空,而可空引用类型允许引用类型默认为不可空,从而降低了出现空引用异常的风险。

可空值类型

可空值类型允许值类型接受空值。 要声明可空值类型,请在? 到数据类型:

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

在这个示例中,nullableDouble 可以保存 double 值或 null。

可空引用类型

C# 8.0 引入了可空引用类型。您可以在项目级别或通过在代码文件开头添加 #nullable 启用指令来启用可空引用类型。启用可空引用类型后,引用类型必须使用"...... "显式标记为可空,这有助于避免空引用导致的潜在运行时异常。

#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 为空。 如果在声明非空引用类型时不带?,编译器在检测到潜在的空赋值时会产生警告。

启用可归零引用类型

要在项目中全局启用可归零引用类型,请在 .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 为空,由于空凝聚运算符的作用,b 将得到值 10。 否则,b 的值为 nullableInt。

示例 2:可归零引用类型

现在,让我们来看看可空引用类型是如何工作的:

#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 可以为空,而空值凝聚运算符可确保如果为空,字符串的长度默认为 0。

示例 3:嵌套的可归零类型

C# 允许您声明嵌套的可空类型。例如

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

虽然嵌套的可空类型看似多余,但在 C# 中它们在语法上是有效的。 然而,在实践中,嵌套的可空类型并不提供任何额外功能,也很少使用。

空凝聚操作符 (??)

空合并运算符(??)经常用于可空类型,当可空类型为空时提供默认值。 该操作符通过避免明确的 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 为空,defaultValue 将被赋值为-1。否则,defaultValue 将取 nullableValue 的值。

编译时错误和可空类型

启用可空引用类型后,C# 在检测到空赋值的潜在问题时,会在编译过程中产生警告和错误。 这些编译时错误有助于及早发现问题,使您的代码更加健壮。

考虑以下示例:

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 可能为空,将其赋值给非空类型可能会导致运行时异常。

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

结论

C# Nullable Types(开发人员如何使用):图3 - IronPDF许可证页面

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

IronPDF 提供免费试用,帮助您在做出决定前探索其功能。 前期无需任何费用,您可以试水,看看如何将其融入您的开发流程。 一旦您准备好继续,许可证起价为$749。

Chipego
软件工程师
Chipego 拥有出色的倾听技巧,这帮助他理解客户问题并提供智能解决方案。他在 2023 年加入 Iron Software 团队,此前他获得了信息技术学士学位。IronPDF 和 IronOCR 是 Chipego 主要专注的两个产品,但他对所有产品的了解每天都在增长,因为他不断找到支持客户的新方法。他喜欢 Iron Software 的合作氛围,公司各地的团队成员贡献他们丰富的经验,以提供有效的创新解决方案。当 Chipego 离开办公桌时,你经常可以发现他在看书或踢足球。
< 前一页
C# ConfigureAwait(面向开发人员的工作原理)
下一步 >
C# 命名约定(如何为开发人员工作)