AIDE .NET

Opérateur conditionnel Null en C# (Comment ça marche pour les développeurs)

Publié mars 6, 2024
Partager:

L'opérateur conditionnel Null de C# offre un moyen plus concis et plus sûr de gérer les valeurs nulles dans votre code. La beauté de cet opérateur réside dans sa capacité à simplifier les vérifications de nullité, ce qui rend votre code plus propre et plus lisible.

Examinons plus en détail comment la opérateur conditionnel nul ses avantages et la manière dont vous pouvez l'utiliser dans vos projets. Nous explorerons également IronPDF et son utilisation avec l'opérateur conditionnel Null.

Qu'est-ce que l'opérateur conditionnel Null ?

L'opérateur conditionnel nul, souvent appelé "opérateur Elvis" en raison de sa ressemblance avec la coiffure d'Elvis Presley ( ?.)permet d'accéder à un membre ou d'appeler une méthode sur un objet uniquement si cet objet n'est pas nul.

Si l'objet est nul, l'opération renvoie null au lieu de lever une exception de référence nulle. Cet opérateur change la donne pour les développeurs, car il réduit considérablement la quantité de code nécessaire pour accéder en toute sécurité aux membres d'objets potentiellement nuls.

Les bases des opérateurs conditionnels nuls

Pour comprendre l'opérateur conditionnel null, prenons l'exemple de la classe publique Employee. Cette classe peut avoir des propriétés telles que chaîne publique Prénom et chaîne publique Nom. Dans le code C# traditionnel, l'accès à une propriété d'un objet Employé potentiellement nul nécessite des vérifications explicites de nullité pour éviter les exceptions :

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#

Toutefois, grâce à l'opérateur conditionnel null, vous pouvez simplifier cette opération en une seule ligne :

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

Si employé n'est pas nul, la variable nom reçoit la valeur de employé.Prénom. Si employé est nul, nom prend la valeur null. Cette simple ligne de code remplace donc élégamment plusieurs lignes de vérifications explicites de la nullité.

Combinaison avec des opérateurs de fusion nulle

L'opérateur conditionnel nul devient encore plus puissant lorsqu'il est combiné avec l'opérateur opérateur d'affectation de coalescence nulle (??=). L'opérateur de coalescence null vous permet de spécifier une valeur par défaut dans le cas où une expression est évaluée à null.

Par exemple, si vous voulez vous assurer que la variable nom a une valeur par défaut de "Inconnu " au lieu de null, vous pouvez écrire :

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

Ce code vérifie si employé est nul et attribue "Inconnu " à nom si employé.Prénom est nul. Il traite élégamment les valeurs nulles en une seule opération, montrant à quel point votre code peut être concis et efficace.

C# a introduit les types nullables, qui permettent aux variables de contenir soit une valeur non nulle de leur type sous-jacent, soit null.

Utilisation avancée : Null Conditional et Collections

Lorsque l'on travaille avec des collections, l'opérateur conditionnel null peut être utilisé pour accéder à un élément sans risquer une exception de référence nulle. Supposons que vous disposiez d'une liste d'employés et que vous souhaitiez accéder au nom du premier élément en toute sécurité. Vous pouvez utiliser l'opérateur avec des crochets :

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

Cette ligne de code est à l'épreuve des threads, ce qui signifie que si un autre thread transforme employés en null après la vérification de null mais avant d'accéder au premier élément, votre code ne se bloquera pas. Lorsqu'il s'agit de types nullables, il est important de comprendre leur type de valeur sous-jacent, qui est le type non nullable associé au type nullable.

Sécurité des fils et opérateur conditionnel Null

L'une des subtilités de l'utilisation de l'opérateur conditionnel null est sa fonction de sécurité thread. Lorsque vous utilisez cet opérateur, l'évaluation de l'expression est à l'abri des threads. Cela signifie que si vous accédez à une ressource partagée susceptible d'être modifiée par un autre thread, l'utilisation de l'opérateur conditionnel null permet d'éviter d'éventuelles conditions de course.

Cependant, il est important de comprendre que si l'opérateur lui-même est sûr pour l'opération qu'il effectue, il ne garantit pas la sécurité pour l'ensemble de votre bloc de code ou de votre séquence d'opérations.

Exemple pratique

Prenons un exemple plus pratique, celui d'un objet susceptible de déclencher un événement. En C# traditionnel, vous devriez vérifier si le gestionnaire d'événement est nul avant d'invoquer l'événement afin d'éviter une exception de référence nulle :

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#

Avec l'opérateur conditionnel nul, cela peut être simplifié :

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#

Ce code concis permet d'obtenir le même résultat, mais de manière plus lisible et plus sûre. Dans les cas où vous souhaitez renvoyer explicitement null, vous pouvez simplement utiliser l'instruction \N-return null;\N-return null;\N-return null;\N-return null;\N-return null ;. L'opérateur ?. court-circuite l'opération si PropertyChanged est null, évitant ainsi une exception. Voici le code complet :

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#

Voici le résultat du code :

Opérateur conditionnel Null en C# (Comment ça marche pour les développeurs) : Figure 1

Introduction à IronPDF dans C&num ; Projets

IronPDF est une bibliothèque polyvalente pour les développeurs C# qui vous permet de créer, modifier, et extraire le PDF dans les applications .NET. Cette bibliothèque se distingue par sa facilité d'utilisation et sa capacité à intégrer de manière transparente des fonctionnalités PDF dans n'importe quel projet .NET.

La fonctionnalité principale d’IronPDF est la conversion HTML vers PDF, avec préservation complète de la mise en page et du style. C'est une excellente solution pour générer des PDF à partir de contenu web, y compris des rapports, des factures et de la documentation. Il prend en charge la conversion de fichiers HTML, d'URL et de chaînes HTML en fichiers 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#

Que vous produisiez des rapports, des factures ou tout autre document au format PDF, IronPDF fournit un ensemble complet d'outils pour accomplir ces tâches efficacement.

Intégration d'IronPDF avec des opérateurs conditionnels nuls

L'intégration d'IronPDF dans votre projet pour gérer les PDF en conjonction avec les opérateurs conditionnels null peut considérablement améliorer la robustesse de votre application. Cette combinaison est particulièrement utile lorsqu'il s'agit de traiter un contenu PDF susceptible d'être nul ou d'effectuer des opérations pouvant potentiellement aboutir à une valeur nulle.

Examinons un exemple simple dans lequel nous utilisons IronPDF pour générer un document PDF à partir d'un contenu HTML. Nous utiliserons ensuite l'opérateur conditionnel null pour accéder en toute sécurité aux propriétés du document, illustrant ainsi la manière de traiter les valeurs null avec élégance.

Installation d'IronPDF

Tout d'abord, vous devez ajouter IronPDF à votre projet. Vous pouvez le faire via le gestionnaire de paquets NuGet :

Install-Package IronPdf

Écrivez maintenant le code suivant dans le fichier 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#

Sortie

Voici la sortie de la console lorsque vous exécutez le programme :

Opérateur conditionnel Null en C# (Comment ça marche pour les développeurs) : Figure 2

Voici le PDF généré par le programme :

Opérateur conditionnel Null en C# (Comment ça marche pour les développeurs) : Figure 3

Conclusion

Opérateur conditionnel Null en C# (Comment ça marche pour les développeurs) : Figure 4

L'intégration d'IronPDF avec des opérateurs conditionnels null dans vos projets C# peut considérablement rationaliser vos tâches de manipulation de PDF tout en garantissant que votre code est à l'abri des exceptions de référence null. Cet exemple a démontré la synergie entre une puissante bibliothèque PDF et les fonctionnalités modernes du langage C#, vous permettant d'écrire un code plus propre et plus facile à maintenir.

N'oubliez pas que la clé d'une utilisation efficace de ces outils réside dans la compréhension de leurs capacités et dans leur utilisation judicieuse dans vos projets.

IronPDF offre aux développeurs un service gratuit de procès commencent à $749, offrant un accès continu au support complet et aux mises à jour.

< PRÉCÉDENT
Collection C# (Comment ça marche pour les développeurs)
SUIVANT >
Méthode de mise en veille des threads en C# (comment cela fonctionne pour les développeurs)