Comparteix via


nuevo modificador (Referencia de C#)

Cuando se usa la new palabra clave como modificador de declaración, se oculta explícitamente un miembro que proporciona una clase base. Al ocultar un miembro heredado, la versión derivada del miembro reemplaza a la versión de clase base. Puede ocultar un miembro cuando la versión de la clase base sea visible en la clase derivada. La versión de la clase base no está visible si está marcada como private o, en algunos casos, internal. Aunque puede ocultar public o protected miembros sin usar el new modificador , recibirá una advertencia del compilador. Si usa new para ocultar explícitamente un miembro, suprime esta advertencia.

La documentación de referencia del lenguaje C# cubre la versión más reciente publicada del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.

La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.

Sugerencia

Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.

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

Para ocultar un miembro heredado, anótelo en la clase derivada mediante el mismo nombre de miembro y modifíquelo con la new palabra clave . Por ejemplo:

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

En este ejemplo, BaseC.Invoke está oculto por DerivedC.Invoke. El campo x no se ve afectado porque no está oculto por un nombre similar.

El nombre que oculta a través de la herencia toma una de las formas siguientes:

  • Por lo general, una constante, un campo, una propiedad o un tipo que se introducen en una clase o estructura oculta todos los miembros de clase base que comparten su nombre. Sin embargo, existen algunos casos especiales. Por ejemplo, si declara un nuevo campo con nombre N para tener un tipo que no es invocable y un tipo base declara N que es un método, el nuevo campo no oculta la declaración base en la sintaxis de invocación. Para obtener más información, consulte la sección Búsqueda de miembros de la especificación del lenguaje C#.

  • Un método que se introduce en una clase o estructura oculta propiedades, campos y tipos que comparten ese nombre en la clase base. También oculta todos los métodos de clase base que tienen la misma firma.

  • Un indexador que se introduce en una clase o estructura oculta todos los indizadores de clase base que tienen la misma firma.

Es un error usar e newinvalidar en el mismo miembro, ya que los dos modificadores tienen significados mutuamente excluyentes. El new modificador crea un nuevo miembro con el mismo nombre y hace que el miembro original se oculte. El override modificador extiende la implementación de un miembro heredado.

El uso del new modificador en una declaración que no oculta un miembro heredado genera una advertencia.

Ejemplos

En este ejemplo, una clase base, BaseC, y una clase derivada, DerivedC, usan el mismo nombre xde campo , que oculta el valor del campo heredado. En el ejemplo se muestra el uso del new modificador . También muestra cómo acceder 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. En el ejemplo se muestra cómo usar el new modificador para eliminar el mensaje de advertencia y cómo acceder a los miembros de clase ocultos 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 new modificador, el programa sigue compilando y se ejecuta, pero recibe 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 modificador new de la especificación del lenguaje C#.

Consulte también