Migración de una base de código a NRT
Aplique una estrategia de migración por fases: active las advertencias, anote las API, corrija los problemas y evite los falsos positivos.
Migración de una base de código a NRT es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
El desafío de la migración
Habilitar NRT en una base de código existente suele producir cientos de advertencias. Un enfoque de cambio radical es arriesgado. En su lugar, use una migración por fases: habilite las advertencias gradualmente, corríjalas archivo por archivo y no pierda nunca el ritmo.
Paso 1: habilitar únicamente las advertencias
Comience con <Nullable>warnings</Nullable> en lugar de enable. Esto activa las advertencias sin tratar el código sin anotaciones como errores, por lo que constituye un punto de partida seguro.
<!-- 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 -->Paso 2: habilitar por archivo
Añada #nullable enable al principio de cada archivo a medida que trabaje en él. De este modo, los cambios se limitan a los archivos que está editando, lo que facilita las revisiones.
#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 uncheckedCategorización de las advertencias
Las advertencias se dividen en dos categorías: seguras de suprimir (entidades de ORM y campos inyectados mediante DI) y errores reales (valores que realmente son null y se desreferencian). Distinga entre ambas antes de suprimir nada.
// 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!
}Corrección de la advertencia de constructor CS8618
CS8618 aparece cuando una propiedad que no admite null no se establece en el constructor. La solución preferida es exigirla en el constructor. Use = null! únicamente para valores establecidos por el framework.
// 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;
}
}Gestión de API heredadas
Es posible que las API de terceros o heredadas no tengan anotaciones. Sus tipos de retorno son oblivious (no se consideran ni anulables ni no anulables). Asigne sus resultados a variables que admitan null para dejarlo explícito.
// 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 versionsUso de #pragma para suprimir advertencias específicas
Cuando una advertencia sea realmente un falso positivo y = null! resulte demasiado poco claro, use #pragma warning disable con un ámbito limitado a la línea específica.
// 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 CoreTratar las advertencias de NRT como errores
Cuando haya corregido todas las advertencias de un archivo, añada <WarningsAsErrors>Nullable</WarningsAsErrors> (o use una validación en CI) para evitar regresiones: cualquier problema nuevo relacionado con valores null hará que falle la compilación.
<!-- After full migration: treat nullable warnings as build errors -->
<PropertyGroup>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<!-- Or selectively: -->
<!-- <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors> -->
</PropertyGroup>Anotación de API públicas
Cuando otros consumen su biblioteca, las anotaciones de NRT pasan a formar parte del contrato de su API pública. Devuelva T? cuando el resultado pueda ser null y T cuando esté garantizado que no lo sea.
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);
}Métricas y seguimiento de la migración
Realice un seguimiento del progreso contando los archivos que contienen #nullable enable o ejecutando dotnet build 2>&1 | grep CS86 en CI. Establezca una fecha objetivo para completar la migración del proyecto.
# 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 sprintComprobación rápida
¿Qué comunica la asignación = null! en una propiedad que no admite null?
Resumen: migración a NRT
Conceptos clave:
- Use una migración por fases: modo de advertencias → habilitación por archivo → habilitación global
- Diferencie los errores reales (corríjalos) de los patrones de ORM o DI (use
= null!) - Corrija CS8618 exigiendo los valores en los constructores, no suprimiendo la advertencia
- Asigne los resultados de API heredadas a variables
T?para hacerlo explícito - Trate las advertencias de valores null como errores en CI para evitar regresiones
- Las API públicas con anotaciones se convierten en contratos claros para los consumidores
Preguntas frecuentes
¿La lección «Migración de una base de código a NRT» es gratis?
Sí — el texto completo de «Migración de una base de código a NRT» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Migración de una base de código a NRT»?
Aplique una estrategia de migración por fases: active las advertencias, anote las API, corrija los problemas y evite los falsos positivos. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Migración de una base de código a NRT»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Activación y comprensión de NRT
- Anotaciones: ?, !, MaybeNull y NotNull
- Operadores null-conditional y null-coalescing
- Migración de una base de código a NRT