跳至页脚内容
.NET 帮助

C# 双问号(开发者如何使用)

在C#编程中,高效处理空值是一个常见的挑战。 输入双问号运算符(??),这是一项功能强大的特性,旨在优化空合并运算符。 新开发人员经常会对这个双问号运算符的意义感到疑惑。 查看此来源以获得更精确的答案:理解C#中的双问号

在本文中,我们将深入探讨C#双问号运算符的复杂性,研究其功能、用例以及它如何改变开发人员在代码中处理空值的方法。

理解基础知识:C#中的空合并运算符

空合并是一种编程概念,当遇到空引用时分配默认值。 传统上,开发人员使用条件运算符或三元运算符来实现空合并。 C#空合并运算符提供了一种更简洁和富有表现力的方式来处理这些场景。

??的本质

空合并运算符(??)是一个二元运算符,如果左操作数不为空,则返回其值; 否则返回右操作数。 它提供了一种简洁的语法,用于在处理可空类型或可能的空引用时提供默认的非空值。

简单用法和语法

空合并赋值运算符的基本语法是在两个表达式之间放置??。 这是一个简单的例子:

int? nullableValue = possiblyNullInt ?? defaultValue;
int? nullableValue = possiblyNullInt ?? defaultValue;
Dim nullableValue? As Integer = If(possiblyNullInt, defaultValue)
$vbLabelText   $csharpLabel

在这种情况下,如果possiblyNullInt不为空,nullableValue将取其值。 否则,它将默认为指定的defaultValue。 对于那些好奇nullableValue变量类型的人来说,它是一个可空类型值。 这意味着nullableValue也允许设置为空值,这对于常规整数是不可能的。

简化空检查

空合并运算符的主要优点之一是其简化空检查的能力,使代码更简洁和易读。 考虑没有运算符的以下场景:

string result;
if (possiblyNullString != null)
{
    result = possiblyNullString;
}
else
{
    result = "DefaultValue";
}
string result;
if (possiblyNullString != null)
{
    result = possiblyNullString;
}
else
{
    result = "DefaultValue";
}
Dim result As String
If possiblyNullString IsNot Nothing Then
	result = possiblyNullString
Else
	result = "DefaultValue"
End If
$vbLabelText   $csharpLabel

使用双问号运算符,等效代码变为:

string result = possiblyNullString ?? "DefaultValue";
string result = possiblyNullString ?? "DefaultValue";
Dim result As String = If(possiblyNullString, "DefaultValue")
$vbLabelText   $csharpLabel

这种减少样板代码的做法提升了代码的清晰度,降低了空相关错误的可能性。

连锁运算符实现默认值

可以将双问号运算符串联在一起,以提供一系列的后备值,允许级联方式的默认值。

int result = possiblyNullInt ?? fallbackInt ?? 0;
int result = possiblyNullInt ?? fallbackInt ?? 0;
Dim result As Integer = If(If(possiblyNullInt, fallbackInt), 0)
$vbLabelText   $csharpLabel

在此示例中,如果possiblyNullInt为空,运算符检查fallbackInt。 如果两者都为空,最终后备值为0。这意味着结果不必是可空类型,因为后备值始终是整数。

在方法参数中的应用

双问号运算符在指定方法参数的默认值时特别有用。

public void PrintMessage(string message = null)
{
    string defaultMessage = "Default Message";
    string finalMessage = message ?? defaultMessage;
    Console.WriteLine(finalMessage);
}
public void PrintMessage(string message = null)
{
    string defaultMessage = "Default Message";
    string finalMessage = message ?? defaultMessage;
    Console.WriteLine(finalMessage);
}
Public Sub PrintMessage(Optional ByVal message As String = Nothing)
	Dim defaultMessage As String = "Default Message"
	Dim finalMessage As String = If(message, defaultMessage)
	Console.WriteLine(finalMessage)
End Sub
$vbLabelText   $csharpLabel

在此方法中,如果message为空,则使用默认值“Default Message”。

与三元运算符的结合

双问号运算符可以与三元运算符(? :)结合使用,以实现更高级的条件处理。 在这里,如果possiblyNullInt为空,它会检查anotherNullableInt是否具有值。

int? nullableValue = possiblyNullInt ?? (anotherNullableInt.HasValue ? anotherNullableInt.Value : 0);
int? nullableValue = possiblyNullInt ?? (anotherNullableInt.HasValue ? anotherNullableInt.Value : 0);
Dim nullableValue? As Integer = If(possiblyNullInt, (If(anotherNullableInt.HasValue, anotherNullableInt.Value, 0)))
$vbLabelText   $csharpLabel

如果是,则使用该值; 否则,默认为0。 使用IronPDF掌握PDF生成是一个多功能的C#库,旨在简化与PDF工作相关的复杂性。

IronPDF 简介

无论是生成发票、报告还是任何其他文档,IronPDF都能让您在C#应用程序中无缝地将HTML内容转换为精美专业的PDF。 IronPDF的主要特性是其HTML到PDF转换工具,确保布局和样式保持不变。

它从网络内容生成PDF,非常适合报告、发票和文档。 此功能支持将HTML文件、URL和HTML字符串转换为PDF。 C# Double Question Mark (开发人员如何工作): 图1 - IronPDF网页

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

要将IronPDF合并到您的C#项目中,请首先安装IronPDF NuGet包。

安装 IronPDF:快速入门

在您的包管理器控制台中执行以下命令: 或者,在NuGet包管理器中找到“IronPDF”并继续安装。

Install-Package IronPdf

使用IronPDF创建PDF是一个简单的过程。

使用 IronPDF 生成 PDF

考虑以下示例: 在此示例中,IronPDF用于将HTML内容渲染为PDF文档,然后保存到指定位置。

var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
// Create a new PDF document
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
// Create a new PDF document
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
Dim htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>"
' Create a new PDF document
Dim pdfDocument = New IronPdf.ChromePdfRenderer()
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf")
$vbLabelText   $csharpLabel

请访问此 探索IronPDF代码示例 资源,获取更多创建PDF文档的方法。 ### C#双问号运算符:巧妙处理默认值

C#中的双问号运算符(??)是一个强大的工具,用于处理可空类型并在必要时提供默认值。

让我们探索如何将该运算符与IronPDF无缝集成,以提高文档生成场景中的非可空值类型。 ### 与IronPDF配置的集成

考虑一个需要设置IronPDF默认配置的场景,例如页面大小或边距。

可以使用双问号运算符在未明确定义特定配置时提供默认值。 在此示例中,如果GetUserDefinedPageSize()返回空值,则使用默认的A4页面大小。

var customPageSize = GetUserDefinedPageSize(); // Assume this method might return null
var defaultRenderingOptions = new ChromePdfRenderOptions();
defaultRenderingOptions.PaperSize = customPageSize ?? IronPdf.Rendering.PdfPaperSize.A4;
// Create a new PDF document with optional custom page size
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderingOptions = defaultRenderingOptions;
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("GeneratedDocument.pdf");
var customPageSize = GetUserDefinedPageSize(); // Assume this method might return null
var defaultRenderingOptions = new ChromePdfRenderOptions();
defaultRenderingOptions.PaperSize = customPageSize ?? IronPdf.Rendering.PdfPaperSize.A4;
// Create a new PDF document with optional custom page size
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderingOptions = defaultRenderingOptions;
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("GeneratedDocument.pdf");
Dim customPageSize = GetUserDefinedPageSize() ' Assume this method might return null
Dim defaultRenderingOptions = New ChromePdfRenderOptions()
defaultRenderingOptions.PaperSize = If(customPageSize, IronPdf.Rendering.PdfPaperSize.A4)
' Create a new PDF document with optional custom page size
Dim pdfDocument = New IronPdf.ChromePdfRenderer()
pdfDocument.RenderingOptions = defaultRenderingOptions
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("GeneratedDocument.pdf")
$vbLabelText   $csharpLabel

利用默认文本进行动态内容生成

假设您正在动态生成PDF内容,并且某些文本元素可能为空。

可以使用双问号运算符优雅地处理空值并提供默认文本。 在这里,如果GetDynamicHeaderText()返回空值,PDF中的标题文本默认为“Hello World!”;

string dynamicHeaderText = GetDynamicHeaderText(); // Assume this method might return null
string headerText = dynamicHeaderText ?? "Hello World!";
// Incorporate the header text into HTML content
var dynamicHtmlContent = $@"
    <html>
    <body>
        <h1>{headerText}</h1>
        <!-- Other dynamic content -->
    </body>
    </html>
";
// Create a new PDF document with dynamic content
var dynamicPdfDocument = new IronPdf.ChromePdfRenderer();
dynamicPdfDocument.RenderHtmlAsPdf(dynamicHtmlContent).SaveAs("DynamicDocument.pdf");
string dynamicHeaderText = GetDynamicHeaderText(); // Assume this method might return null
string headerText = dynamicHeaderText ?? "Hello World!";
// Incorporate the header text into HTML content
var dynamicHtmlContent = $@"
    <html>
    <body>
        <h1>{headerText}</h1>
        <!-- Other dynamic content -->
    </body>
    </html>
";
// Create a new PDF document with dynamic content
var dynamicPdfDocument = new IronPdf.ChromePdfRenderer();
dynamicPdfDocument.RenderHtmlAsPdf(dynamicHtmlContent).SaveAs("DynamicDocument.pdf");
Dim dynamicHeaderText As String = GetDynamicHeaderText() ' Assume this method might return null
Dim headerText As String = If(dynamicHeaderText, "Hello World!")
' Incorporate the header text into HTML content
Dim dynamicHtmlContent = $"
    <html>
    <body>
        <h1>{headerText}</h1>
        <!-- Other dynamic content -->
    </body>
    </html>
"
' Create a new PDF document with dynamic content
Dim dynamicPdfDocument = New IronPdf.ChromePdfRenderer()
dynamicPdfDocument.RenderHtmlAsPdf(dynamicHtmlContent).SaveAs("DynamicDocument.pdf")
$vbLabelText   $csharpLabel

否则,使用GetDynamicHeaderText()方法中的文本。 C# Double Question Mark (开发人员如何工作): 图2 - 上述代码的默认标题

有关生成更多动态内容并探索IronPDF的更多功能,请访问IronPDF文档页面。

总之,C#双问号运算符为空合并提供了精确和富有表现力的解决方案。

结论

其简单性和可读性使其成为在各种场景中处理空值的有价值的工具。 无论是处理可空类型、潜在的空引用,还是提供默认值,双问号运算符使开发人员能够在C#编程的动态世界中精确处理空值。 C#双问号运算符与IronPDF无缝集成,以增强文档生成工作流中的默认值处理。

无论是设置配置还是处理动态内容,该运算符都提供了简洁而富于表现力的方式来导航空值,并确保顺畅可预测的PDF生成过程。 利用IronPDF的强大功能和双问号运算符的灵活性,以清晰和效率提升您的C#文档生成能力。 IronPDF在开发阶段是免费的,但为测试其完整功能,需要在发布之前获得授权完整功能

IronPDF is free for development, but it needs to be licensed for full functionality to test out its complete functionality before making a decision.

常见问题解答

C# 双问号运算符的目的是什么?

C# 双问号运算符的目的,也称为空合并运算符,是在处理空引用时提供一种简洁的默认值分配方式。它通过返回左操作数(如果它不是空的),否则返回右操作数,从而简化代码。

双问号运算符如何提高代码可读性?

双问号运算符通过减少冗长的空值检查来提高代码可读性。它允许开发人员通过在一个表达式中处理默认值来编写更简洁的代码。

双问号运算符如何用于方法参数中?

在方法参数中,双问号运算符用于分配默认值,确保方法能够优雅地处理空输入,即使参数缺失也能保持功能性。

双问号运算符在使用 C# 生成 PDF 时扮演什么角色?

在使用 C# 生成 PDF 时,可以使用双问号运算符提供默认文本或配置以生成动态内容,确保即使某些数据为空,输出也具有鲁棒性。

双问号运算符可以链式调用来提供多个回退值吗?

是的,双问号运算符可以链式调用以提供多个回退值。此链式调用将继续进行,直到找到非空值,或使用最终回退值。

C# PDF 库如何与双问号运算符集成?

C# PDF 库可以集成双问号运算符,以在 HTML 转换为 PDF 时高效管理默认设置和处理空值,从而提高功能性和用户体验。

C# PDF 库的安装步骤是什么?

要安装 C# PDF 库,通常使用包管理器控制台运行安装命令,或者在 NuGet 包管理器中找到该库并从那里安装。

使用 C# PDF 库是否需要费用?

许多 C# PDF 库在开发期间是免费提供的。然而,为了访问完整功能,通常需要许可,让开发者在购买前全面探索库的功能。

Curtis Chau
技术作家

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

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