Opérateurs conditionnels et de coalescence null
Combinez ?., ?[], ?? et ??= pour écrire un code concis et sûr vis-à-vis de null, sans vérifications verbeuses.
Opérateurs conditionnels et de coalescence null est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.
Schémas de code protégés contre les valeurs nulles
C# fournit trois opérateurs dédiés pour gérer les valeurs nulles de manière concise : l’opérateur conditionnel sur null (?., ?[]), l’opérateur de coalescence (??) et l’opérateur d’affectation par coalescence (??=). Ensemble, ils évitent la plupart du code répétitif et verbeux de vérification de nullité.
Opérateur conditionnel sur null : ?.
?. s’arrête et renvoie null si le membre de gauche est null, au lieu de lever une NullReferenceException. Le type du résultat devient potentiellement nul.
User? user = GetUser(id);
// Without ?.:
string? name = null;
if (user != null) name = user.Name;
// With ?.:
string? name2 = user?.Name;
// Chained:
string? city = user?.Address?.City;
// Method call:
string? upper = user?.Name?.ToUpper();Opérateur conditionnel sur null avec accès par index : ?[]
?[] est l’opérateur d’indexation conditionnel sur null. Il permet d’accéder sans risque aux éléments d’un tableau ou d’une collection lorsque la collection elle-même peut être nulle.
List<string>? tags = product?.Tags;
// Safe index access
string? firstTag = tags?[0];
// Null-conditional LINQ
int? count = tags?.Count;
bool? hasItems = tags?.Any();
// With methods:
string? joined = tags?.FirstOrDefault()?.ToUpper();Opérateur de coalescence : ??
?? renvoie l’opérande de gauche s’il n’est pas nul ; sinon, il renvoie l’opérande de droite (la valeur de repli). C’est le remplacement concis de x != null ? x : fallback.
string? name = GetName();
// Without ??:
string display = name != null ? name : "Anonymous";
// With ??:
string display2 = name ?? "Anonymous";
// Chaining ?? for multiple fallbacks:
string result = primary ?? secondary ?? tertiary ?? "Default";
// Combining with ?.
string city = user?.Address?.City ?? "Unknown City";Affectation avec coalescence de null : ??=
??= affecte la partie droite à la variable uniquement si celle-ci vaut actuellement null. C’est idéal pour les schémas d’initialisation différée.
// Lazy initialization
private List<string>? _cache;
public List<string> GetCache()
{
_cache ??= new List<string>(); // only assigns if null
return _cache;
}
// Equivalent to:
// if (_cache is null) _cache = new List<string>();
// In-place:
string? name = null;
name ??= "Default";
Console.WriteLine(name); // "Default"Utiliser ?. avec les événements
L’opérateur conditionnel sur null est la manière standard et sûre vis-à-vis des threads d’invoquer des événements : il évite la condition de concurrence qui survient lorsqu’on effectue séparément la vérification de null et l’invocation.
public event EventHandler<DataEventArgs>? DataReceived;
// Thread-safe event invocation:
DataReceived?.Invoke(this, new DataEventArgs(data));
// This is equivalent to:
var handler = DataReceived;
if (handler != null) handler(this, new DataEventArgs(data));
// (local copy avoids race condition between check and invoke)Exemples de chaînage complexe
La combinaison des opérateurs permet de parcourir proprement et lisiblement des graphes d’objets profondément imbriqués tout en gérant les valeurs null.
var order = GetOrder(id);
// Deeply nested with fallbacks:
string countryCode = order
?.Customer
?.ShippingAddress
?.Country
?.Code
?? "US";
// Collection safe access:
decimal firstLineTotal = order
?.Lines
?.FirstOrDefault()
?.Total
?? 0m;
// Method chain:
string? trackingUpper = order?.TrackingNumber?.ToUpper().Trim();Opérateur conditionnel sur null avec LINQ
L’opérateur conditionnel sur null fonctionne parfaitement avec LINQ et permet d’effectuer des requêtes sûres sur des collections ou des propriétés pouvant être null.
List<Order>? orders = customer?.Orders;
// Safe LINQ on a nullable collection:
var totalRevenue = orders?.Sum(o => o.Total) ?? 0m;
var pendingCount = orders?.Count(o => o.Status == OrderStatus.Pending) ?? 0;
var latest = orders?.MaxBy(o => o.PlacedAt)?.Id;Gardes contre null avec ThrowIfNull
Pour les paramètres qui ne doivent pas être null, utilisez ArgumentNullException.ThrowIfNull() (.NET 6+) afin d’effectuer une validation concise et explicite à l’entrée de la méthode.
public void ProcessOrder(Order order, Customer customer)
{
ArgumentNullException.ThrowIfNull(order);
ArgumentNullException.ThrowIfNull(customer);
// From this point, compiler knows both are non-null
Console.WriteLine(order.Id);
Console.WriteLine(customer.Name);
}
// .NET 7+: ArgumentException.ThrowIfNullOrEmpty
void Save(string name)
{
ArgumentException.ThrowIfNullOrWhiteSpace(name);
// name is guaranteed non-empty
}Motif « non nul » dans les expressions de sélection
La mise en correspondance de motifs avec is not null et is { } fournit des schémas de vérification de null clairs, particulièrement dans les expressions de sélection.
string Describe(object? obj) => obj switch
{
null => "nothing",
string s when s.Length == 0 => "empty string",
string s => $"string: {s}",
int i => $"integer: {i}",
{ } => $"object: {obj.GetType().Name}"
};
// is not null in if statements:
if (order is not null && order.Customer is { Name: var name })
Console.WriteLine(name);Vérification rapide
Que renvoie l’expression user?.Name ?? "Anonymous" lorsque user vaut null ?
Récapitulatif : conditionnel sur null et coalescence de null
À retenir :
?.: accès sûr à un membre — renvoie null au lieu de lever une exception lorsque le récepteur est null?[]: accès sûr à un index dans des collections potentiellement null??: valeur fallback lorsque l’opérande gauche est null??=: affectation uniquement si la valeur est null — idéal pour l’initialisation différée- Combinez-les :
a?.B?.C ?? defaultValpour parcourir en profondeur des objets tout en gérant les valeurs null ArgumentNullException.ThrowIfNull()pour les gardes de validation des paramètres
Questions Fréquemment Posées
La leçon « Opérateurs conditionnels et de coalescence null » est-elle gratuite ?
Oui — le texte complet de « Opérateurs conditionnels et de coalescence null » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Opérateurs conditionnels et de coalescence null » ?
Combinez ?., ?[], ?? et ??= pour écrire un code concis et sûr vis-à-vis de null, sans vérifications verbeuses. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C# Academy ?
Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Opérateurs conditionnels et de coalescence null » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?
Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Activer et comprendre NRT
- Annotations : ?, !, MaybeNull et NotNull
- Opérateurs conditionnels et de coalescence null
- Migrer une base de code vers NRT