.NET 幫助

C# Null 條件運算子(開發人員如何運作)

發佈 2024年3月6日
分享:

C# 的 Null Conditional 運算子提供了一種更簡潔且安全的方法來處理程式碼中的空值。 該運算子的美妙之處在於其簡化空值檢查的能力,使您的代碼更簡潔且更易讀。

讓我們深入探討該產品如何運作的具體細節null 條件運算子讓它發揮作用,其好處,以及如何在您的專案中使用它。 我們還將探索IronPDF及其使用案例及其與 Null 條件運算子的使用案例。

什麼是空條件運算子?

空條件運算子,因外觀類似於艾維斯·普里斯萊的髮型而常被稱為「Elvis 運算子」(?.),允許您僅在對象不為空的情況下執行成員訪問或方法調用。

如果物件為空,操作將返回空值,而不是拋出空引用例外。 這個運算子對開發者而言是一個革命性的改變,因為它大幅減少了安全存取可能為空的物件成員所需的代碼量。

空條件運算子的基礎知識

要了解空條件運算子,請考慮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 不為空,則 name 變數接收 employee.FirstName 的值。 如果employee為空,則name設為空。 這行代碼因而優雅地取代了多行明確的空檢查。

與空值合併運算子結合使用

空條件運算符在與...結合使用時會變得更加強大。空合併賦值運算子 (??=). 空合併運算子允許您在表達式評估為空值時指定預設值。

例如,如果您想確保 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# 引入了可空類型,允許變數持有其基礎類型的非空值或 null。

進階使用:Null 條件和集合

在使用集合時,可以使用空條件運算子來訪問元素,而不會冒空引用異常的風險。 假設你有一個員工列表並想安全地訪問第一個元素的名字。 您可以使用方括號的運算符:

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

這行程式碼是執行緒安全的,這意味著如果另一個執行緒在空檢查之後但在存取其第一個元素之前將 employees 變為 null,您的程式碼不會崩潰。 在處理可空類型時,理解其基礎值類型非常重要,這是與可空類型相關的不可空類型。

執行緒安全性和空條件運算子

使用空條件運算符的一個微妙之處是其線程安全性功能。 當您使用此運算子時,表達式的評估是執行緒安全的。 這意味著,如果您正在存取可能被其他執行緒修改的共享資源,使用空條件運算子可以防止潛在的競賽條件。

然而,重要的是要理解,儘管操作符本身在其執行的操作中是線程安全的,但它並不保證整個代碼塊或操作序列的線程安全性。

實際範例

讓我們考慮一個更實際的例子,您有一個物件可能會觸發事件。 在傳統的 C# 中,您會在調用事件之前檢查事件處理程序是否為 null,以避免空引用異常:

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# 空條件運算子(對開發人員的運作方式):圖 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,可以顯著提升應用程式的健全性。 這種組合在處理可能為空的 PDF 內容或執行可能導致空值的操作時特別有用。

讓我們來探討一個簡單的例子,我們使用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# 空条件运算符(开发人员如何使用):图2

這是由程序生成的 PDF:

C# Null 條件運算符(開發人員如何使用):圖 3

結論

C# 空條件運算子(對開發人員的運作方式):圖4

在您的 C# 專案中整合 IronPDF 與 Null 條件運算子,可以顯著簡化 PDF 處理任務,同時確保您的程式碼免受 null 引用例外的影響。 此範例展示了強大的 PDF 函式庫與現代 C# 語言功能之間的協作,使您能夠撰寫更乾淨、更易於維護的代碼。

請記住,有效使用這些工具的關鍵在於了解其功能並在您的項目中明智地應用它們。

IronPDF為開發者提供免費的試用提供完整的支援和更新。,從 Lite License 開始。

< 上一頁
C# 集合(開發人員如何使用)
下一個 >
C# Thread Sleep 方法(對開發人員的運作方式)

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >