
C# 可空类型(开发者用法)
当使用C#时,你往往需要处理空值,尤其是引用类型。C#中的可空类型提供了一种对值类型表示未定义或缺失值的方法。本指南介绍了C#可空类型的重要性,它们的实际用途,以及如何在不同情况下工作。 我们将在文章后面探讨IronPDF。
Nullable Types in C#
默认情况下,C#(例如int、bool、DateTime)中的值类型不能被赋予空值。 为了解决这一限制,C#引入了可空值类型,允许你将空赋给值类型。当你需要表示缺失的有效值时,可空类型特别有用。
声明可空类型
要在C#中声明可空类型,你可以使用以下语法:
// Declare a nullable integer
int? nullableInt = null;' Declare a nullable integer
Dim nullableInt? As Integer = Nothing这里,int? 是 Nullable<int> 的简写。 nullableInt 变量可以存储 int 值或 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 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或者,你可以使用空合并运算符(??)在可空类型为空时提供一个默认值:
// 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)如果 nullableInt 为 null,result 将被赋值为默认值 0。
可空值类型与可空引用类型
在C#中,值类型(如int、bool和double)与引用类型(如string,object)不同。 可空值类型允许值类型表示空值,而可空引用类型允许引用类型默认情况下不可为空,从而减少空引用异常的风险。
可空值类型
可空值类型允许一个值类型接受空值。 要声明可空值类型,请在数据类型后附加问号 ?:
// Declare a nullable double
double? nullableDouble = null;' Declare a nullable double
Dim nullableDouble? As Double = Nothing在此示例中,nullableDouble 可以存储 double 值或 null。
可空引用类型
在 C# 8.0 中引入了可空引用类型。您可以在项目级别启用可空引用类型,或者在代码文件的开头添加 #nullable enable 指令。启用可空引用类型后,引用类型必须使用 ? 显式标记为可空,以帮助避免由于 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这里,nullableString 允许为 null。 如果您在声明非可空引用类型时没有使用 ?,编译器在检测到可能的 null 分配时会生成警告。
启用可空引用类型
要在项目中全局启用可空引用类型,请在您的 .csproj 文件中添加以下行:
<Nullable>enable</Nullable>
一旦启用,编译器将默认将引用类型视为不可为空。 该特性特别有助于在编译时捕捉空引用问题,而不是在运行时。
实用示例
让我们探索一些实用示例来巩固你对可空类型的理解。
示例 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");
}
}
}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这里,nullableInt 是一个 int 类型的可空变量。 如果 nullableInt 为 null,由于空合并运算符,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);
}
}'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在上面的代码中,nullableString 可以为 null,空合并运算符确保如果它为 null,字符串的长度默认值为 0。
示例 3: 嵌套可空类型
C#允许你声明嵌套的可空类型。例如:
// Redundant, but syntactically valid
int? nestedNullableInt = null;' Redundant, but syntactically valid
Dim nestedNullableInt? As Integer = Nothing虽然嵌套的可空类型可能显得多余,但在C#中它们是语法上有效的。 然而,在实践中,嵌套可空类型不提供任何额外功能,且很少使用。
空合并运算符(??)
空合并运算符(??)经常用于可空类型以在可空类型为空时提供默认值。 此运算符通过避免显式的if-else检查简化代码。
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)在此示例中,如果 nullableValue 为 null,defaultValue 将被赋值为-1。否则,defaultValue 将取 nullableValue 的值。
编译时错误与可空类型
启用可空引用类型时,C#在编译时产生警告和错误,当它检测到潜在的空值赋值问题。 这些编译时错误有助于提前捕捉问题,使你的代码更为健壮。
请考虑以下示例:
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在这种情况下,将 nullableString 赋值给 nonNullableString 会产生编译器警告,因为 nullableString 可能为 null,将其赋值给非可空类型可能导致运行时异常。
在IronPDF中使用可空类型

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.");
}
}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
在此代码中,可空类型 (int? 和 string?) 被用来安全处理缺失数据。 空合并运算符(??)确保如果任何数据缺失,将在PDF中使用默认值。
结论
C#中的可空类型是处理值类型和引用类型中空值的有力工具。通过使用可空类型,您可以避免空引用异常并提高代码的健壮性。 记得在新项目中启用可空引用类型以便从编译时错误检查中受益,并使用空合并运算符(??)以简化处理可空类型时的代码。
IronPDF提供一个免费试用以帮助你在做出承诺前探索其功能。 无需提前付费,你可以试水并看它如何适合你的开发过程。 一旦您准备好继续,许可证从 $999 开始。

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。
相关文章


