Activer et comprendre NRT
Activez le contexte nullable, comprenez la différence entre les types de référence nullable et non nullables, puis interprétez les avertissements du compilateur.
Activer et comprendre NRT est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 1 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.
L’erreur à un milliard de dollars
Tony Hoare, l’inventeur de null, a qualifié ce choix de « son erreur à un milliard de dollars ». En C#, tout type référence pouvait être null par défaut, ce qui faisait de NullReferenceException le plantage d’exécution le plus courant. Les types référence nullables (NRT) corrigent ce problème au niveau du compilateur.
Activer le contexte de nullabilité
Activez NRT globalement dans votre fichier de projet ou fichier par fichier à l’aide de directives. Une fois cette option activée, le compilateur considère par défaut les types référence comme non nuls.
<!-- In .csproj — enable for the whole project -->
<PropertyGroup>
<Nullable>enable</Nullable>
</PropertyGroup>
// Or per-file:
#nullable enable
// ... code with NRT warnings
#nullable disable
// ... code without NRT warningsTypes référence non nuls et pouvant être nuls
Avec NRT activé : string signifie que la valeur est toujours non nulle, tandis que string? signifie qu’elle peut être nulle. Le compilateur signale l’affectation de null à un type non nul ou le déréférencement d’une valeur pouvant être nulle sans vérification.
#nullable enable
string nonNull = "Hello"; // OK
string? maybeNull = null; // OK — explicitly nullable
nonNull = null; // WARNING: CS8600
Console.WriteLine(maybeNull.Length); // WARNING: CS8602 — may be null
// Fix:
if (maybeNull is not null)
Console.WriteLine(maybeNull.Length); // safeAnalyse du flux
Le compilateur effectue une analyse du flux : il suit l’état de nullité dans les conditions et les branches, et supprime les avertissements lorsqu’il peut prouver qu’une valeur n’est pas nulle.
string? name = GetName();
// After null check, name is treated as non-null:
if (name is not null)
Console.WriteLine(name.Length); // no warning
// Same with early return:
if (name is null) return;
Console.WriteLine(name.Length); // no warning — null was returned
// Pattern matching:
if (name is string s)
Console.WriteLine(s.ToUpper()); // no warningAvertissements de nullabilité : CS8600–CS8629
Principaux avertissements NRT à comprendre : CS8600 (affectation de null à un type non nul), CS8602 (déréférencement d’une valeur potentiellement nulle), CS8603 (retour de null pour un type non nul), CS8618 (champ non nul non initialisé).
#nullable enable
public class Order
{
public string CustomerName { get; set; } // CS8618: not initialized
public string? TrackingNumber { get; set; } // OK — nullable
public Order(string name)
{
CustomerName = name; // now initialized — CS8618 gone
}
}
string? s = GetValue();
Console.WriteLine(s.Length); // CS8602: s might be nullInitialiser les champs non nuls
CS8618 apparaît lorsqu’un champ ou une propriété non nul n’est pas défini dans le constructeur. Solutions : l’initialiser dans sa déclaration, l’exiger via le constructeur ou utiliser l’opérateur de suppression de nullité pour les modèles DI/ORM.
// Option 1: Initialize in declaration
public string Name { get; set; } = "";
// Option 2: Require via constructor
public class Product
{
public string Name { get; }
public Product(string name) => Name = name;
}
// Option 3: null-forgiving for ORM entities
public string Name { get; set; } = null!;
// null! tells compiler "trust me, this will be set by EF Core"Nullabilité dans les types génériques
Les paramètres de type génériques peuvent être contraints à ne pas accepter de valeur nulle. Une contrainte where T : notnull garantit que T ne peut jamais être nul.
// Without constraint: T could be nullable
public T? Find<T>(int id) { ... }
// With notnull: T must be a non-nullable type
public T FindRequired<T>(int id) where T : notnull
{
var result = InternalFind<T>(id);
return result ?? throw new KeyNotFoundException();
}
// T? is meaningful only when T is known to be non-nullable
public T? FindOrDefault<T>(int id) where T : class { ... }Nullabilité dans les interfaces et les substitutions
Lorsqu’une interface est implémentée ou qu’une méthode est remplacée, les annotations de nullabilité doivent correspondre. Le compilateur vérifie que les implémentations sont au moins aussi non nulles que ce que déclare l’interface.
public interface IRepository<T>
{
T? FindById(int id); // may return null
T GetOrThrow(int id); // never null
}
// Implementation:
public class ProductRepo : IRepository<Product>
{
public Product? FindById(int id) => _db.Find(id);
public Product GetOrThrow(int id) =>
_db.Find(id) ?? throw new KeyNotFoundException();
}Types valeur pouvant être nuls et types référence pouvant être nuls
Ne confondez pas int? (Nullable<int> — un conteneur de type valeur qui existait avant C# 8) avec string? (une annotation NRT prise en compte uniquement à la compilation, sans surcharge à l’exécution).
// Nullable value type (runtime Nullable<int>)
int? age = null;
bool hasValue = age.HasValue;
int value = age.GetValueOrDefault();
// Nullable reference type (compile-time annotation only)
string? name = null;
// string? has NO runtime wrapper — it's just a compile-time hint
// null check is still needed at runtime
if (name is not null)
Console.WriteLine(name.ToUpper());Supprimer les avertissements avec !
L’opérateur de suppression de nullité (!) supprime un avertissement précis de nullabilité lorsque vous savez que le compilateur se trompe. Utilisez-le avec parcimonie et indiquez pourquoi son utilisation est sûre.
// Use ! when you know the value cannot be null
var user = _db.Users.FirstOrDefault(u => u.Email == email);
var name = user!.Name; // user is guaranteed by business logic
// EF Core navigation properties set by the framework:
public class Order
{
public Customer Customer { get; set; } = null!; // set by EF Core
}Cas réel : réponse d’API nullable
Une enveloppe d’API dont certains champs peuvent être présents ou absents de la réponse JSON : les annotations de nullabilité expriment clairement l’intention.
#nullable enable
public class WeatherResponse
{
public string City { get; set; } = ""; // always present
public double Temperature { get; set; } // always present
public string? Description { get; set; } // optional field
public string? AlertMessage { get; set; } // only when there's an alert
}
// Consumer:
var weather = await api.GetWeatherAsync("London");
Console.WriteLine(weather.City); // safe
Console.WriteLine(weather.Description?.ToUpper() ?? "N/A"); // safe null-handlingVérification rapide
Quelle surcharge à l’exécution les types référence nullables (string?) entraînent-ils par rapport aux types référence ordinaires (string) ?
Récapitulatif : activer et comprendre NRT
Points clés :
- Activez globalement avec
<Nullable>enable</Nullable>dans .csproj string= jamais nul ;string?= peut être nul- L’analyse du flux suit l’état de nullité dans les branches et les retours
- Les annotations NRT sont prises en compte uniquement à la compilation : aucune surcharge à l’exécution
- CS8618 : initialisez les champs non nuls dans le constructeur ou utilisez
= null!pour l’ORM - Utilisez ! avec parcimonie et indiquez pourquoi la suppression de nullité est sûre
Questions Fréquemment Posées
La leçon « Activer et comprendre NRT » est-elle gratuite ?
Oui — le texte complet de « Activer et comprendre NRT » 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 « Activer et comprendre NRT » ?
Activez le contexte nullable, comprenez la différence entre les types de référence nullable et non nullables, puis interprétez les avertissements du compilateur. 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 1 sur 4.
Combien de temps prend la leçon « Activer et comprendre NRT » ?
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