.NET 帮助

C#空条件运算符(开发人员如何使用)

发布 2024年三月6日
分享:

C# 空条件运算符提供了一种更简洁和安全的方式来处理代码中的空值。 这个操作符的美妙之处在于它能够简化空值检查,使你的代码更加简洁和易读。

让我们深入探讨一下如何空 "条件运算符它的工作原理、优势以及如何将其用于您的项目。 我们还将探索IronPDF 及其使用案例及其与 Null 条件运算符的用例。

什么是空条件运算符?

空条件运算符,通常被称为“猫王运算符”,因为它看起来像猫王普雷斯利的发型。(?.),允许您仅在对象不为空时对其执行成员访问或方法调用。

如果对象为空,操作将返回空值,而不是抛出空引用异常。 这个操作符对开发人员来说是一个颠覆性的改变,因为它显著减少了安全访问可能为null对象的成员所需的代码量。

空条件运算符的基础知识

要了解空条件运算符,请考虑public class Employee示例。 该类可能具有诸如 public string FirstNamepublic string LastName 等属性。 在传统的C#代码中,访问一个可能为空的Employee对象的属性需要显式的空检查以避免异常:

if (employee != null)
{
    var name = employee.FirstName;
}
if (employee != null)
{
    var name = employee.FirstName;
}
If employee IsNot Nothing Then
	Dim name = employee.FirstName
End If
VB   C#

不过,使用空条件操作符可以将其简化为一行:

var name = employee?.FirstName;
var name = employee?.FirstName;
Dim name = employee?.FirstName
VB   C#

如果 employee 不为 null,则 name 变量接收 employee.FirstName 的值。 如果employee为null,name将设置为null。 这一行代码因此可以优雅地替换多行显式的空检查。

结合空合并运算符

当空条件运算符与空凝聚赋值运算符 (??=). 空合并运算符允许您在表达式计算为 null 的情况下指定默认值。

例如,如果您想确保 name 变量有一个默认值 "Unknown" 而不是 null,您可以这样写:

var name = employee?.FirstName ?? "Unknown";
var name = employee?.FirstName ?? "Unknown";
Dim name = If(employee?.FirstName, "Unknown")
VB   C#

该代码检查 employee 是否为空,如果 employee.FirstName 为空,则将 "Unknown" 赋值给 name。 它优雅地在一次操作中处理空值,展示了你的代码如何变得简洁和高效。

C# 引入了可空类型,这种类型允许变量持有其基础类型的非空值或空值。

高级用法:空条件和集合

在处理集合时,可以使用空条件运算符访问元素,而不会有空引用异常的风险。 假设你有一个员工列表,并想安全地访问第一个元素的名字。 您可以使用带有方括号的运算符:

var firstName = employees?[0]?.FirstName ?? "Unknown";
var firstName = employees?[0]?.FirstName ?? "Unknown";
Dim firstName = If(employees?(0)?.FirstName, "Unknown")
VB   C#

这行代码是线程安全的,这意味着如果在空检查之后但在访问其第一个元素之前,另一个线程将employees更改为null,您的代码不会崩溃。 在处理可空类型时,重要的是要了解其基础值类型,即与可空类型相关联的非可空类型。

线程安全和空条件运算符

使用空条件运算符的一个微妙之处在于其线程安全功能。 当您使用此运算符时,表达式的评估是线程安全的。 这意味着,如果您正在访问可能会被另一个线程修改的共享资源,使用空条件运算符可以防止潜在的竞争条件。

然而,重要的是要理解,虽然运算符本身对于它执行的操作是线程安全的,但它并不能保证整个代码块或操作序列的线程安全。

实际例子

让我们考虑一个更实际的例子,其中您有一个可能触发事件的对象。 在传统的C#中,为了避免空引用异常,你需要在调用事件之前检查事件处理程序是否为空:

if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs(name));
}
if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs(name));
}
If PropertyChanged IsNot Nothing Then
	PropertyChanged(Me, New PropertyChangedEventArgs(name))
End If
VB   C#

利用空条件运算符,可以简化为

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
If PropertyChanged IsNot Nothing Then
	PropertyChanged.Invoke(Me, New PropertyChangedEventArgs(name))
End If
VB   C#

这段简洁的代码实现了相同的结果,但以更易读和安全的方式。 在需要明确返回 null 的情况下,您只需使用 return null; 语句即可。 ?. 操作符如果 PropertyChanged 为 null,则短路操作,从而防止异常。 以下是完整代码:

using System.ComponentModel;
public class Person : INotifyPropertyChanged
{
    private string name;
    public event PropertyChangedEventHandler PropertyChanged;
    public string Name
    {
        get { return name; }
        set
        {
            if (name != value)
            {
                name = value;
                OnPropertyChanged(nameof(Name));
            }
        }
    }
    protected virtual void OnPropertyChanged(string propertyName)
    {
        // Using the null conditional operator to safely invoke the event
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
class Program
{
    static void Main(string [] args)
    {
        Person person = new Person();
        person.PropertyChanged += (sender, e) =>
        {
            Console.WriteLine($"{e.PropertyName} property has changed.");
        };
        person.Name = "Iron Software"; // This will trigger the PropertyChanged event
    }
}
using System.ComponentModel;
public class Person : INotifyPropertyChanged
{
    private string name;
    public event PropertyChangedEventHandler PropertyChanged;
    public string Name
    {
        get { return name; }
        set
        {
            if (name != value)
            {
                name = value;
                OnPropertyChanged(nameof(Name));
            }
        }
    }
    protected virtual void OnPropertyChanged(string propertyName)
    {
        // Using the null conditional operator to safely invoke the event
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
class Program
{
    static void Main(string [] args)
    {
        Person person = new Person();
        person.PropertyChanged += (sender, e) =>
        {
            Console.WriteLine($"{e.PropertyName} property has changed.");
        };
        person.Name = "Iron Software"; // This will trigger the PropertyChanged event
    }
}
Imports System.ComponentModel
Public Class Person
	Implements INotifyPropertyChanged

'INSTANT VB NOTE: The field name was renamed since Visual Basic does not allow fields to have the same name as other class members:
	Private name_Conflict As String
	Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
	Public Property Name() As String
		Get
			Return name_Conflict
		End Get
		Set(ByVal value As String)
			If name_Conflict <> value Then
				name_Conflict = value
				OnPropertyChanged(NameOf(Name))
			End If
		End Set
	End Property
	Protected Overridable Sub OnPropertyChanged(ByVal propertyName As String)
		' Using the null conditional operator to safely invoke the event
		RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
	End Sub
End Class
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim person As New Person()
		AddHandler person.PropertyChanged, Sub(sender, e)
			Console.WriteLine($"{e.PropertyName} property has changed.")
		End Sub
		person.Name = "Iron Software" ' This will trigger the PropertyChanged event
	End Sub
End Class
VB   C#

以下是代码的输出:

C# Null 条件操作符(开发人员如何使用):图 1

C# 项目中的 IronPdf 简介

IronPDF是一个面向 C# 开发人员的多功能库,允许您创建、编辑和提取 PDF 内容在 .NET 应用程序中,您可以使用这些工具。 该库因其易用性和能将PDF功能无缝集成到任何.NET项目中而脱颖而出。

IronPDF的顶级功能是转换HTML 转换为 PDF,保留完整的风格, 完全保留布局和样式。 这是一个从网页内容生成PDF的极佳解决方案,包括报告、发票和文档。 它支持将HTML文件、URL和HTML字符串转换为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");
    }
}
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
VB   C#

无论是生成报告、发票,还是任何PDF格式的文档,IronPDF都提供了一整套工具来高效完成这些任务。

使用空条件运算符集成 IronPDF

将IronPDF集成到您的项目中以处理PDF文件,并结合null条件运算符,可以显著增强应用程序的稳健性。 这种组合在处理可能为null的PDF内容或执行可能导致null值的操作时特别有用。

让我们来看一个简单的示例,演示如何使用IronPDF从HTML内容生成PDF文档。 然后我们将使用空条件操作符安全地访问文档的属性,展示如何优雅地处理空值。

安装 IronPDF

首先,你需要将 IronPDF 添加到你的项目中。 您可以通过NuGet包管理器完成此操作:

Install-Package IronPdf

现在,在 program.cs 文件中写入以下代码:

using IronPdf;
using System;
public class PdfGenerator
{
    public static void CreatePdf(string htmlContent, string outputPath)
    {
        // Instantiate the HtmlToPdf converter
        var renderer = new IronPdf.ChromePdfRenderer();
        // Generate a PDF document from HTML content
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
        // Use the null conditional operator to safely access the document's properties
        var pageCount = pdfDocument?.PageCount ?? 0;
        // Check if the PDF was generated successfully and has pages
        if (pageCount > 0)
        {
            // Save the PDF document to the specified output path
            pdfDocument.SaveAs(outputPath);
            Console.WriteLine($"PDF created successfully with {pageCount} pages.");
        }
        else
        {
            // Handle cases where the PDF generation fails or returns null
            Console.WriteLine("Failed to create PDF or the document is empty.");
        }
    }
    public static void Main(string [] args)
    {
        // Define the HTML content for the PDF document
        string htmlContent = @"
            <html>
            <head>
                <title>Test PDF</title>
            </head>
            <body>
                <h1>Hello, IronPDF!</h1>
                <p>This is a simple PDF document generated from HTML using IronPDF.</p>
            </body>
            </html>";
        // Specify the path where the PDF document will be saved
        // Ensure this directory exists on your machine or adjust the path accordingly
        string filePath = @"F:\GeneratedPDF.pdf";
        // Call the method to generate and save the PDF document
        CreatePdf(htmlContent, filePath);
        // Wait for user input before closing the console window
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }
}
using IronPdf;
using System;
public class PdfGenerator
{
    public static void CreatePdf(string htmlContent, string outputPath)
    {
        // Instantiate the HtmlToPdf converter
        var renderer = new IronPdf.ChromePdfRenderer();
        // Generate a PDF document from HTML content
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
        // Use the null conditional operator to safely access the document's properties
        var pageCount = pdfDocument?.PageCount ?? 0;
        // Check if the PDF was generated successfully and has pages
        if (pageCount > 0)
        {
            // Save the PDF document to the specified output path
            pdfDocument.SaveAs(outputPath);
            Console.WriteLine($"PDF created successfully with {pageCount} pages.");
        }
        else
        {
            // Handle cases where the PDF generation fails or returns null
            Console.WriteLine("Failed to create PDF or the document is empty.");
        }
    }
    public static void Main(string [] args)
    {
        // Define the HTML content for the PDF document
        string htmlContent = @"
            <html>
            <head>
                <title>Test PDF</title>
            </head>
            <body>
                <h1>Hello, IronPDF!</h1>
                <p>This is a simple PDF document generated from HTML using IronPDF.</p>
            </body>
            </html>";
        // Specify the path where the PDF document will be saved
        // Ensure this directory exists on your machine or adjust the path accordingly
        string filePath = @"F:\GeneratedPDF.pdf";
        // Call the method to generate and save the PDF document
        CreatePdf(htmlContent, filePath);
        // Wait for user input before closing the console window
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }
}
Imports IronPdf
Imports System
Public Class PdfGenerator
	Public Shared Sub CreatePdf(ByVal htmlContent As String, ByVal outputPath As String)
		' Instantiate the HtmlToPdf converter
		Dim renderer = New IronPdf.ChromePdfRenderer()
		' Generate a PDF document from HTML content
		Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
		' Use the null conditional operator to safely access the document's properties
		Dim pageCount = If(pdfDocument?.PageCount, 0)
		' Check if the PDF was generated successfully and has pages
		If pageCount > 0 Then
			' Save the PDF document to the specified output path
			pdfDocument.SaveAs(outputPath)
			Console.WriteLine($"PDF created successfully with {pageCount} pages.")
		Else
			' Handle cases where the PDF generation fails or returns null
			Console.WriteLine("Failed to create PDF or the document is empty.")
		End If
	End Sub
	Public Shared Sub Main(ByVal args() As String)
		' Define the HTML content for the PDF document
		Dim htmlContent As String = "
            <html>
            <head>
                <title>Test PDF</title>
            </head>
            <body>
                <h1>Hello, IronPDF!</h1>
                <p>This is a simple PDF document generated from HTML using IronPDF.</p>
            </body>
            </html>"
		' Specify the path where the PDF document will be saved
		' Ensure this directory exists on your machine or adjust the path accordingly
		Dim filePath As String = "F:\GeneratedPDF.pdf"
		' Call the method to generate and save the PDF document
		CreatePdf(htmlContent, filePath)
		' Wait for user input before closing the console window
		Console.WriteLine("Press any key to exit...")
		Console.ReadKey()
	End Sub
End Class
VB   C#

输出

这是运行程序时的控制台输出:

C# Null 条件操作符(开发人员如何使用):图 2

这是程序生成的PDF:

C# Null 条件操作符(开发人员如何使用):图 3

结论

C# Null 条件操作符(开发人员如何使用):图 4

在你的 C# 项目中使用空条件运算符集成 IronPDF 可以显著简化 PDF 处理任务,同时确保代码安全,不会出现空引用异常。 这个示例展示了强大的PDF库与现代C#语言特性之间的协同作用,使您能够编写更简洁、更易维护的代码。

记住,成功使用这些工具的关键在于理解它们的功能并在您的项目中明智地应用它们。

IronPDF为开发者提供了免费的提供全面支持和更新的试用从 Lite License 开始。

< 前一页
C# 集合(开发人员如何使用)
下一步 >
C# 线程睡眠方法(开发人员如何使用)

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,781,565 查看许可证 >