new (Modificador, Referencia de C#)

Cuando se utiliza como modificador de una declaración, la palabra clave new oculta explícitamente un miembro heredado de una clase base. Cuando se oculta un miembro heredado, la versión derivada del miembro reemplaza a la versión de la clase base. Esto supone que la versión de clase base del miembro es visible, ya que ya estaría oculta si se hubiera marcado como private o, en algunos casos, como internal. Aunque los miembros public o protected se pueden ocultar sin utilizar el modificador new, se generará una advertencia del compilador. Si utiliza new explícitamente para ocultar un miembro, se suprime esta advertencia.

También puede usar la palabra clave new para crear una instancia de un tipo o como una restricción de tipo genérico.

Para ocultar un miembro heredado, declárelo en la clase derivada con el mismo nombre de miembro y modifíquelo con la palabra clave new. Por ejemplo:

public class BaseC
{
    public int x;
    public void Invoke() { }
}
public class DerivedC : BaseC
{
    new public void Invoke() { }
}

En este ejemplo, BaseC.Invoke oculta DerivedC.Invoke. El campo x no se ve afectado porque no lo oculta un nombre similar.

La ocultación de nombres por medio de la herencia toma una de las siguientes formas:

  • Normalmente, una constante, un campo, una propiedad o un tipo que se muestran en una clase o struct ocultan a todos los miembros de la clase base que comparten su nombre. Hay casos especiales. Por ejemplo, si declara un nuevo campo con el nombre N para tener un tipo que no es invocable y un tipo base declara N como método, el nuevo campo no oculta la declaración base en la sintaxis de invocación. Para obtener más información, vea la sección Búsqueda de miembros de la Especificación del lenguaje C#.

  • Un método introducido en una clase o struct oculta las propiedades, los campos y los tipos que comparten el nombre en la clase base. También oculta todos los métodos de la clase base que tienen la misma signatura.

  • Un indizador introducido en una clase o struct oculta todos los indizadores de la clase base que tienen la misma signatura.

Es un error usar new y override en el mismo miembro, porque los dos modificadores tienen significados mutuamente excluyentes. El modificador new crea un nuevo miembro con el mismo nombre y oculta el miembro original. El modificador override amplía la implementación de un miembro heredado.

Si se utiliza el modificador new en una declaración que no oculta un miembro heredado, se genera una advertencia.

Ejemplos

En este ejemplo, una clase base, BaseC, y una clase derivada, DerivedC, utilizan el mismo nombre de campo x, lo que oculta el valor del campo heredado. El ejemplo muestra el uso del modificador new. También muestra cómo obtener acceso a los miembros ocultos de la clase base mediante sus nombres completos.

public class BaseC
{
    public static int x = 55;
    public static int y = 22;
}

public class DerivedC : BaseC
{
    // Hide field 'x'.
    new public static int x = 100;

    static void Main()
    {
        // Display the new value of x:
        Console.WriteLine(x);

        // Display the hidden value of x:
        Console.WriteLine(BaseC.x);

        // Display the unhidden member y:
        Console.WriteLine(y);
    }
}
/*
Output:
100
55
22
*/

En este ejemplo, una clase anidada oculta una clase que tiene el mismo nombre en la clase base. El ejemplo muestra cómo utilizar el modificador new para eliminar el mensaje de advertencia y cómo obtener acceso a los miembros de la clase oculta mediante sus nombres completos.

public class BaseC
{
    public class NestedC
    {
        public int x = 200;
        public int y;
    }
}

public class DerivedC : BaseC
{
    // Nested type hiding the base type members.
    new public class NestedC
    {
        public int x = 100;
        public int y;
        public int z;
    }

    static void Main()
    {
        // Creating an object from the overlapping class:
        NestedC c1  = new NestedC();

        // Creating an object from the hidden class:
        BaseC.NestedC c2 = new BaseC.NestedC();

        Console.WriteLine(c1.x);
        Console.WriteLine(c2.x);
    }
}
/*
Output:
100
200
*/

Si quita el modificador new, el programa seguirá compilándose y ejecutándose, pero aparecerá la siguiente advertencia:

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

Especificación del lenguaje C#

Para obtener más información, vea la sección El modificador new de la Especificación del lenguaje C#.

Consulte también