.NET-HILFE

C# Null Conditional Operator (Wie es funktioniert für Entwickler)

Veröffentlicht 6. März 2024
Teilen Sie:

C# Null Conditional Operator bietet eine prägnantere und sicherere Möglichkeit, Nullwerte in Ihrem Code zu behandeln. Das Schöne an diesem Operator ist, dass er Null-Prüfungen vereinfacht und Ihren Code sauberer und lesbarer macht.

Lassen Sie uns auf die Einzelheiten eingehen, wie die null-Bedingungsoperator funktioniert, welche Vorteile es bietet und wie Sie es in Ihren Projekten einsetzen können. Wir werden auch Folgendes erforschen IronPDF und seine Verwendung mit dem Null-Bedingungsoperator.

Was ist der Null-Bedingungsoperator?

Der Null-Bedingungsoperator, der wegen seiner Ähnlichkeit mit der Frisur von Elvis Presley oft als "Elvis-Operator" bezeichnet wird (?.)erlaubt den Zugriff auf Mitglieder oder Methodenaufrufe auf ein Objekt nur, wenn dieses Objekt nicht null ist.

Wenn das Objekt null ist, gibt der Vorgang null zurück, anstatt eine Null-Referenz-Ausnahme auszulösen. Dieser Operator ist ein entscheidender Vorteil für Entwickler, da er den Umfang des Codes, der für den sicheren Zugriff auf Mitglieder von potenziell ungültigen Objekten erforderlich ist, erheblich reduziert.

Die Grundlagen der bedingten Null-Operatoren

Um den Null-Bedingungsoperator zu verstehen, betrachten Sie das Beispiel der öffentlichen Klasse Employee. Diese Klasse kann Eigenschaften wie public string FirstName und public string LastName haben. In herkömmlichem C#-Code erfordert der Zugriff auf eine Eigenschaft eines potenziell ungültigen Employee-Objekts explizite Nullprüfungen, um Ausnahmen zu vermeiden:

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#

Mit dem Null-Bedingungsoperator können Sie dies jedoch auf eine Zeile vereinfachen:

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

Wenn Mitarbeiter nicht null ist, erhält die Variable Name den Wert von Mitarbeiter.Vorname. Wenn Mitarbeiter Null ist, wird Name auf Null gesetzt. Diese einzige Codezeile ersetzt somit auf elegante Weise mehrere Zeilen expliziter Nullprüfungen.

Kombinieren mit Null-Koalitionsoperatoren

Der Null-Bedingungsoperator wird noch leistungsfähiger, wenn er mit dem null-Koaleszenz-Zuweisungsoperator (??=). Mit dem Null-Koaleszenz-Operator können Sie einen Standardwert angeben, falls ein Ausdruck als Null ausgewertet wird.

Wenn Sie beispielsweise sicherstellen wollen, dass die Variable name den Standardwert "Unbekannt " und nicht null hat, können Sie schreiben:

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

Dieser Code prüft, ob Mitarbeiter null ist, und weist dann "Unbekannt " dem Namen zu, wenn Mitarbeiter.Vorname null ist. Es behandelt Nullwerte elegant in einem einzigen Vorgang und zeigt, wie prägnant und effektiv Ihr Code werden kann.

C# führte nullable Typen ein, die es Variablen erlauben, entweder einen Nicht-Null-Wert ihres zugrundeliegenden Typs oder Null zu enthalten.

Erweiterte Verwendung: Bedingte Null und Sammlungen

Bei der Arbeit mit Sammlungen kann der Null-Bedingungsoperator verwendet werden, um auf ein Element zuzugreifen, ohne eine Null-Referenz-Ausnahme zu riskieren. Angenommen, Sie haben eine Liste von Angestellten und möchten sicher auf den Namen des ersten Elements zugreifen. Sie können den Operator mit eckigen Klammern verwenden:

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

Diese Codezeile ist thread-sicher, d. h. sie stellt sicher, dass Ihr Code nicht abstürzt, wenn ein anderer Thread employees nach der Null-Prüfung, aber vor dem Zugriff auf sein erstes Element auf Null ändert. Beim Umgang mit löschbaren Typen ist es wichtig, den zugrundeliegenden Werttyp zu verstehen, d. h. den nicht löschbaren Typ, der mit dem löschbaren Typ verbunden ist.

Thread-Sicherheit und der Null-Bedingungsoperator

Eine der Feinheiten bei der Verwendung des Null-Bedingungsoperators ist seine Thread-Sicherheitsfunktion. Wenn Sie diesen Operator verwenden, ist die Auswertung des Ausdrucks thread-sicher. Das heißt, wenn Sie auf eine gemeinsam genutzte Ressource zugreifen, die von einem anderen Thread geändert werden könnte, kann die Verwendung des Null-Bedingungsoperators potenzielle Wettlaufbedingungen verhindern.

Es ist jedoch wichtig zu verstehen, dass der Operator selbst zwar für die von ihm ausgeführte Operation thread-sicher ist, aber keine Garantie für die Thread-Sicherheit des gesamten Codeblocks oder der Sequenz von Operationen bietet.

Praktisches Beispiel

Betrachten wir ein praktischeres Beispiel, bei dem Sie ein Objekt haben, das ein Ereignis auslösen könnte. In herkömmlichem C# würden Sie prüfen, ob der Event-Handler null ist, bevor Sie das Ereignis aufrufen, um eine Null-Referenz-Ausnahme zu vermeiden:

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#

Mit dem Null-Bedingungsoperator kann dies vereinfacht werden:

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#

Dieser prägnante Code erzielt das gleiche Ergebnis, ist aber besser lesbar und sicherer. In Szenarien, in denen Sie explizit null zurückgeben möchten, können Sie einfach die Anweisung `return null;` verwenden. Der Operator ?. schließt den Vorgang ab, wenn PropertyChanged null ist, und verhindert so eine Ausnahme. Hier ist der vollständige Code:

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#

Hier ist die Ausgabe des Codes:

C# Bedingter Null-Operator (So funktioniert es für Entwickler): Abbildung 1

Einführung in IronPDF in C# Projekten

IronPDF ist eine vielseitige Bibliothek für C#-Entwickler, die es Ihnen ermöglicht, zu erstellen, zu bearbeiten und pDF-Auszug dokumente innerhalb von .NET-Anwendungen. Diese Bibliothek zeichnet sich durch ihre Benutzerfreundlichkeit und ihre Fähigkeit zur nahtlosen Integration von PDF-Funktionen in jedes .NET-Projekt aus.

Die Hauptfunktion von IronPDF besteht in der Umwandlung HTML zu PDF, mit vollständiger Layout- und Stilbewahrung. Es ist eine großartige Lösung zum Erstellen von PDFs aus Webinhalten, einschließlich Berichten, Rechnungen und Dokumentationen. Es unterstützt die Umwandlung von HTML-Dateien, URLs und HTML-Strings in PDF-Dateien.

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#

Egal, ob Sie Berichte, Rechnungen oder andere Dokumente im PDF-Format erstellen, IronPDF bietet eine umfassende Reihe von Werkzeugen, um diese Aufgaben effizient zu erledigen.

Integration von IronPDF mit bedingten Null-Operatoren

Die Integration von IronPDF in Ihr Projekt, um PDFs in Verbindung mit bedingten Null-Operatoren zu verarbeiten, kann die Robustheit Ihrer Anwendung erheblich verbessern. Diese Kombination ist besonders nützlich, wenn es sich um PDF-Inhalte handelt, die möglicherweise ungültig sind, oder wenn Operationen durchgeführt werden, die möglicherweise zu einem ungültigen Wert führen könnten.

Sehen wir uns ein einfaches Beispiel an, bei dem wir IronPDF verwenden, um ein PDF-Dokument aus HTML-Inhalten zu erzeugen. Anschließend verwenden wir den bedingten Null-Operator, um sicher auf die Dokumenteigenschaften zuzugreifen, und veranschaulichen so, wie man mit Nullwerten umgeht.

Installation von IronPDF

Zunächst müssen Sie IronPDF zu Ihrem Projekt hinzufügen. Sie können dies über den NuGet Package Manager tun:

Install-Package IronPdf

Schreiben Sie nun den folgenden Code in die Datei 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#

Ausgabe

Hier sehen Sie die Konsolenausgabe, wenn Sie das Programm ausführen:

C# Bedingter Null-Operator (So funktioniert es für Entwickler): Abbildung 2

Und dies ist die vom Programm generierte PDF-Datei:

C# Bedingter Null-Operator (So funktioniert es für Entwickler): Abbildung 3

Schlussfolgerung

C# Bedingter Null-Operator (So funktioniert es für Entwickler): Abbildung 4

Durch die Integration von IronPDF mit Null-Bedingungsoperatoren in Ihre C#-Projekte können Sie Ihre PDF-Verarbeitungsaufgaben erheblich rationalisieren und gleichzeitig sicherstellen, dass Ihr Code vor Null-Referenz-Ausnahmen sicher ist. Dieses Beispiel demonstriert die Synergie zwischen einer leistungsstarken PDF-Bibliothek und modernen C#-Sprachfunktionen, die es Ihnen ermöglichen, saubereren und besser wartbaren Code zu schreiben.

Denken Sie daran, dass der Schlüssel zum effektiven Einsatz dieser Tools darin liegt, ihre Fähigkeiten zu verstehen und sie in Ihren Projekten sinnvoll einzusetzen.

IronPDF bietet Entwicklern ein kostenloses versuch beginnen bei $749 und bieten weiterhin Zugang zu vollem Support und Updates.

< PREVIOUS
C# Sammlung (Wie es für Entwickler funktioniert)
NÄCHSTES >
C# Thread Sleep-Methode (Wie es funktioniert für Entwickler)

Sind Sie bereit, loszulegen? Version: 2024.10 gerade veröffentlicht

Gratis NuGet-Download Downloads insgesamt: 11,308,499 Lizenzen anzeigen >