CodeGym /Cursos /C# SELF /Análisis de advertencias del compilador

Análisis de advertencias del compilador

C# SELF
Nivel 14 , Lección 4
Disponible

1. Introducción

Imagina que el código es una obra de teatro y las variables son los actores. Cada vez que una variable entra en una nueva escena (bloque de código), puede estar "viva" (tiene valor) o ser un "fantasma" (null). Pero aquí está el tema: el espectador —el compilador— no ve la obra en directo, sino que solo tiene el guion. Ve dónde se reparten los papeles (se asignan valores) y dónde desaparecen los actores (se vuelven null). Pero no puede mirar la realidad (la ejecución del programa), solo puede suponerlo por el texto del guion.

El análisis estático del flujo de datos es el proceso por el cual el compilador revisa el código antes de ejecutar el programa, para ver si alguien intenta hacer una escena con "caída de NullReferenceException".

La esencia del proceso

Desde C# 8.0 y la aparición del modo Nullable Reference Types (NRT), el compilador analiza si una variable puede ser null en alguna rama de ejecución. Y si es así — te lo dice al instante. No te deja "usar el nombre de un actor que de repente se volvió fantasma".

2. Cómo leer las advertencias del compilador

Categorías principales de advertencias

Cuando el modo NRT está activo, el compilador vigila especialmente las variables de referencia (string, User, arrays, objetos). Aquí tienes los tipos de advertencias más comunes:

  • Possible null assignment — intentas asignar un valor que puede ser null a una variable que no acepta null.
  • Dereference of a possibly null reference — accedes a un miembro de un objeto, pero el compilador duda de que no sea null.
  • Possible null return — un método puede devolver null, aunque según la firma debería devolver un valor.
  • Nullable object must have a value — usas .Value en un tipo nullable sin comprobarlo antes.
  • Unassigned non-nullable property — no has asignado valor a un campo/propiedad que no acepta null.

Normalmente en el IDE (por ejemplo, Rider o Visual Studio) estas advertencias aparecen subrayadas con una línea ondulada, y si pasas el ratón por encima te sale una explicación.

Ejemplo de advertencia típica


#nullable enable

string? possibleNull = GetString();

// Uy uy, el compilador se queja: "Dereference of a possibly null reference"
int length = possibleNull.Length; // ¡Advertencia!

El compilador no está seguro de que possibleNull no sea null, así que acceder a .Length puede lanzar una excepción.

Si el método es así:

string? GetString() { ... }

Y escribes:

string nonNullable = GetString();

Vas a recibir una advertencia: posible asignación insegura de null a una variable non-nullable.

3. El compilador analiza tu código

Ejemplo 1: asignación directa


string? name = null;
Console.WriteLine(name.Length); // Advertencia: posible acceso a null

Aquí está claro: name es null, así que intentar acceder a la propiedad es peligroso.

Ejemplo 2: comprobación de null


string? name = GetUserName();

if (name != null)
{
    Console.WriteLine(name.Length); // ¡Todo ok!
}
else
{
    Console.WriteLine("¡Nombre no especificado!");
}

El compilador entiende que dentro del bloque if (name != null) la variable es segura. Eso es el flow analysis — análisis del flujo de valores según las condiciones.

4. El compilador no puede mirar "dentro del método"

Solo mira la firma — si pone que el método devuelve string?, se cree que puede ser null, aunque dentro siempre devuelva una cadena.

Ejemplo 3: devolver valor desde un método


string? GetMaybeName(bool useName)
{
    if (useName)
        return "Code Jedi";
    else
        return null;
}

void PrintLength()
{
    string? name = GetMaybeName(false);

    Console.WriteLine(name.Length); // ¡Advertencia!
}

El compilador ve que GetMaybeName puede devolver null, así que te pide que tengas cuidado.

5. Escenarios y advertencias comunes

Asignar nullable a una variable non-nullable


string? maybeUser = GetUser();
string alwaysUser = maybeUser; // warning: possible null assignment

Para quitar la advertencia:


string alwaysUser = maybeUser ?? "Invitado";

Ahora siempre habrá una cadena — o del método, o "Invitado".

Olvidaste comprobar .HasValue en un value-type nullable


int? age = GetAge();
int realAge = age.Value; // warning: posible acceso a null

Hay que hacerlo así:


if (age.HasValue)
    Console.WriteLine(age.Value);

O así:


int realAge = age ?? -1;

Propiedades automáticas sin inicialización


class User
{
    public string Name { get; set; } // warning: ¡no inicializado!
}

Soluciones:


public string Name { get; set; } = "Sin nombre";

o


public string? Name { get; set; }

6. Casos complicados de análisis de flujo

Análisis en bucles


string? text = null;

while (text == null)
{
    text = Console.ReadLine();
}

Console.WriteLine(text.Length); // todo ok: ¡el compilador lo pilló!

Diferentes caminos de asignación


string? name;
if (Random.Shared.Next() % 2 == 0)
    name = "Alice";
else
    name = null;

Console.WriteLine(name.Length); // warning: possible null dereference

El compilador analiza todas las ramas. Si en una hay null — te avisa.

7. Cómo "tranquilizar" al compilador (y cuándo no deberías hacerlo)

A veces tú sabes que el valor no puede ser null, pero el compilador no te cree:


string? value = GetSomething();
if (value == null)
    throw new Exception("¡Se esperaba un valor!");

Console.WriteLine(value.Length); // La advertencia desaparece

O usas el operador !:


string? value = GetSomething();
Console.WriteLine(value!.Length); // Sin advertencias, pero ojo que es peligroso

Esto se llama null-forgiving operator. No comprueba nada — solo le dice al compilador: "tranqui, lo tengo controlado". Pero si te equivocas — en tiempo de ejecución te comes una excepción.

2
Tarea
C# SELF, nivel 14, lección 4
Bloqueada
Comprobación de null antes de usar una variable
Comprobación de null antes de usar una variable
2
Tarea
C# SELF, nivel 14, lección 4
Bloqueada
Eliminando advertencias usando el operador de fusión null
Eliminando advertencias usando el operador de fusión null
1
Cuestionario/control
Tipos Nullable, nivel 14, lección 4
No disponible
Tipos Nullable
Introducción a Nullable Reference Types
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION