Translate

domingo, 9 de noviembre de 2025

¿Qué significa new en los métodos de C# ?


Cuando vemos la palabra clave new en C#, lo primero que pensamos es en crear objetos:


var persona = new Persona();


Pero cuando aparece en la declaración de un método, como:


public new static void Saludar() { ... }



…muchos se quedan con cara de 🤔.

Porque en ese contexto, new no crea nada.

Su función es ocultar un método heredado de la clase base.

Veamos qué significa y cuándo conviene usarlo.

En C#, cuando una clase hereda de otra, también hereda sus métodos.

Pero si en la clase hija declarás un método con el mismo nombre y firma, el compilador te lanza una advertencia:


> ⚠️ “El miembro X oculta el miembro heredado Y. Usá la palabra clave new si la ocultación es intencional.”


En ese caso, el compilador te está avisando:

“Estás tapando un método que ya existía en la clase base.”


Y si realmente querés hacerlo, usás el modificador new para decirle al compilador que es intencional.


Veamos un ejemplo: 


class Base

{

    public static void Saludar()

    {

        Console.WriteLine("Hola desde Base");

    }

}


class Derivada : Base

{

    public new static void Saludar()

    {

        Console.WriteLine("Hola desde Derivada");

    }

}


class Program

{

    static void Main()

    {

        Base.Saludar();     // Hola desde Base

        Derivada.Saludar(); // Hola desde Derivada

    }

}


Lo importante:


Derivada.Saludar() oculta el método Base.Saludar().

No hay “sobrescritura” real, porque los métodos estáticos no se pueden sobreescribir.


La palabra clave override sí sobrescribe un método de la clase base, pero solo se puede usar con métodos virtuales o abstractos.


Veamos la diferencia:


class Base

{

    public virtual void Hablar() => Console.WriteLine("Base habla");

}


class Derivada : Base

{

    public override void Hablar() => Console.WriteLine("Derivada habla");

}


Y si en lugar de override usás new:


class Derivada : Base

{

    public new void Hablar() => Console.WriteLine("Derivada habla (ocultando)");

}


Entonces ocurre esto:


Base b = new Derivada();

b.Hablar();

             // Si usás override → Derivada habla

             // Si usás new → Base habla


En otras palabras:

  • override reemplaza el comportamiento de la base.
  • new simplemente lo oculta (pero el de la base sigue existiendo y puede usarse).


Casos comunes donde aparece new


1. En métodos estáticos, donde override no está permitido:


   public new static void Mostrar() => Console.WriteLine("Versión nueva");


2. Para redefinir métodos heredados no virtuales (por ejemplo, ToString() o Equals() de object, aunque no es habitual usar `new` allí).

3. Cuando querés evitar advertencias del compilador si tu método accidentalmente tiene el mismo nombre que uno de la base.


El modificador new en un método no tiene nada que ver con crear objetos.

Sirve para decirle al compilador:


> “Sí, sé que hay un método igual en la clase base, pero quiero ocultarlo y definir el mío propio.”


Sutil, pero importante:

no estás reemplazando comportamiento, estás escondiendo uno.