0Pricing
C# Academy · Leçon

Migrer une base de code vers NRT

Appliquez une stratégie de migration progressive : activez les avertissements, annotez les API, corrigez les problèmes et évitez les faux positifs.

Migrer une base de code vers NRT est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 4 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.

Le défi de la migration

Activer NRT dans une base de code existante produit généralement des centaines d’avertissements. Une approche d’un seul bloc est risquée. Préférez une migration par étapes : activez progressivement les avertissements, corrigez-les fichier par fichier et ne perdez jamais votre élan.

Étape 1 : activer uniquement les avertissements

Commencez par <Nullable>warnings</Nullable> plutôt que par enable. Cela active les avertissements sans traiter le code non annoté comme des erreurs : c’est un point de départ sûr.

<!-- Phase 1: warnings only, no breaking change -->
<PropertyGroup>
  <Nullable>warnings</Nullable>
</PropertyGroup>

<!-- Phase 2: full enable per file as you migrate -->
<!-- Phase 3: switch to enable globally when done -->

Étape 2 : activer fichier par fichier

Ajoutez #nullable enable en haut de chaque fichier lorsque vous travaillez dessus. Les modifications restent ainsi limitées aux fichiers que vous éditez activement, ce qui facilite les revues.

#nullable enable
// Now this file has full NRT analysis

public class OrderService
{
    private readonly IOrderRepository _repo;
    // Compiler now warns about uninitialized non-nullable fields,
    // unsafe dereferences, and assignment to non-nullable

    public OrderService(IOrderRepository repo) => _repo = repo;
}

// Other files without #nullable enable are still unchecked

Catégoriser les avertissements

Les avertissements appartiennent à deux catégories : ceux qu’il est prudent de supprimer (entités ORM, champs injectés par DI) et les bogues réels (valeurs effectivement null déréférencées). Distinguez-les avant de supprimer quoi que ce soit.

// Category 1: safe to suppress with null!
// EF Core navigation properties — set by EF, never null in practice
public class Order
{
    public Customer Customer { get; set; } = null!;
}

// Category 2: real bug — must fix
public string GetFullName()
{
    return FirstName + " " + LastName; // LastName was string? -- BUG!
}

Corriger l’avertissement de constructeur CS8618

CS8618 se déclenche lorsqu’une propriété qui ne doit pas être null n’est pas définie dans le constructeur. La solution à privilégier consiste à l’exiger dans le constructeur. Utilisez = null! uniquement pour les valeurs définies par l’infrastructure.

// BEFORE (CS8618)
public class Product
{
    public string Name { get; set; }   // warning
    public Category Category { get; set; } // warning
}

// AFTER — constructor required:
public class Product
{
    public string Name { get; set; }
    public Category Category { get; set; }

    public Product(string name, Category category)
    {
        Name = name;
        Category = category;
    }
}

Gérer les API anciennes

Les API tierces ou anciennes peuvent ne pas être annotées. Leurs types de retour sont indéterminés (ni susceptibles d’être null, ni garantis comme ne l’étant pas). Affectez leurs résultats à des variables pouvant être null afin d’expliciter votre intention.

// Legacy API returns 'string' but might be null (oblivious type)
string? legacyResult = OldLibrary.GetValue(); // store as nullable
if (legacyResult is null) return;

// Or convert at the boundary:
string safe = OldLibrary.GetValue() ?? "";

// For third-party types, check if they have NRT annotations:
// NuGet packages often add nullable annotations in newer versions

Utiliser #pragma pour supprimer des avertissements précis

Lorsqu’un avertissement est réellement un faux positif et que = null! vous semble trop bruyant, utilisez #pragma warning disable en le limitant à la ligne concernée.

// Suppress for a specific case with explanation:
#pragma warning disable CS8618 // ORM populates this via reflection
public DbSet<Product> Products { get; set; }
#pragma warning restore CS8618

// Or inline with a comment:
public DbSet<Order> Orders { get; set; } = null!; // set by EF Core

Traiter les avertissements NRT comme des erreurs

Une fois tous les avertissements corrigés dans un fichier, ajoutez <WarningsAsErrors>Nullable</WarningsAsErrors> (ou utilisez un contrôle dans CI) pour éviter toute régression : tout nouveau problème lié à null fait échouer la compilation.

<!-- After full migration: treat nullable warnings as build errors -->
<PropertyGroup>
  <Nullable>enable</Nullable>
  <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  <!-- Or selectively: -->
  <!-- <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors> -->
</PropertyGroup>

Annoter les API publiques

Lorsque votre bibliothèque est utilisée par d’autres personnes, les annotations NRT deviennent une partie du contrat de votre API publique. Renvoyez T? lorsque le résultat peut être null, et T lorsqu’il est garanti qu’il ne le sera pas.

public interface IProductService
{
    // Contract: FindById MAY return null, GetById never does
    Product? FindById(int id);
    Product  GetById(int id);  // throws if not found

    // Collection: never null (may be empty)
    IReadOnlyList<Product> GetAll();

    // String: may be empty but not null
    string GetSummary(int id);
}

Mesurer et suivre la migration

Suivez les progrès en comptant les fichiers contenant #nullable enable ou en exécutant dotnet build 2>&1 | grep CS86 dans CI. Fixez une date cible pour achever la migration du projet.

# Count NRT warnings in current build
dotnet build 2>&1 | grep -c 'CS860[0-9]\|CS861[0-9]\|CS862[0-9]'

# List files still missing #nullable enable
grep -rL '#nullable enable' src/ --include='*.cs'

# Track in CI: fail if warning count increases
# Set a budget: warnings <= N, where N decreases each sprint

Vérification rapide

Que signifie l’affectation = null! sur une propriété qui ne doit pas être null ?

Récapitulatif : migrer vers NRT

À retenir :

  • Utilisez une migration par étapes : mode avertissements → activation fichier par fichier → activation globale
  • Distinguez les bogues réels (corrigez-les) des schémas ORM/DI (utilisez = null!)
  • Corrigez CS8618 en exigeant les valeurs dans les constructeurs, plutôt qu’en supprimant l’avertissement
  • Affectez les résultats des API anciennes à des variables T? afin d’expliciter votre intention
  • Traitez les avertissements liés à null comme des erreurs dans CI pour éviter les régressions
  • Les API publiques annotées deviennent des contrats clairs pour leurs utilisateurs

Questions Fréquemment Posées

La leçon « Migrer une base de code vers NRT » est-elle gratuite ?

Oui — le texte complet de « Migrer une base de code vers 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 « Migrer une base de code vers NRT » ?

Appliquez une stratégie de migration progressive : activez les avertissements, annotez les API, corrigez les problèmes et évitez les faux positifs. 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 4 sur 4.

Combien de temps prend la leçon « Migrer une base de code vers 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

  1. Activer et comprendre NRT
  2. Annotations : ?, !, MaybeNull et NotNull
  3. Opérateurs conditionnels et de coalescence null
  4. Migrer une base de code vers NRT
← Retour à C# Academy