new (Modificador, Referencia de C#)new Modifier (C# Reference)

Cuando se utiliza como modificador de una declaración, la palabra clave new oculta explícitamente un miembro heredado de una clase base.When used as a declaration modifier, the new keyword explicitly hides a member that is inherited from a base class. Cuando se oculta un miembro heredado, la versión derivada del miembro reemplaza a la versión de la clase base.When you hide an inherited member, the derived version of the member replaces the base class version. Aunque los miembros se pueden ocultar sin utilizar el modificador new, obtendrá una advertencia del compilador.Although you can hide members without using the new modifier, you get a compiler warning. Si utiliza new explícitamente para ocultar un miembro, se suprime esta advertencia.If you use new to explicitly hide a member, it suppresses this warning.

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.To hide an inherited member, declare it in the derived class by using the same member name, and modify it with the new keyword. Por ejemplo:For example:

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.In this example, BaseC.Invoke is hidden by DerivedC.Invoke. El campo x no se ve afectado porque no lo oculta un nombre similar.The field x is not affected because it is not hidden by a similar name.

La ocultación de nombres por medio de la herencia toma una de las siguientes formas:Name hiding through inheritance takes one of the following forms:

  • 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.Generally, a constant, field, property, or type that is introduced in a class or struct hides all base class members that share its name. Hay casos especiales.There are special cases. 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.For example, if you declare a new field with name N to have a type that is not invocable, and a base type declares N to be a method, the new field does not hide the base declaration in invocation syntax. Vea Especificación del lenguaje C# 5.0 para obtener información detallada (vea "Búsqueda de miembros" en la sección "Expresiones").See the C# 5.0 language specification for details (see section "Member Lookup" in section "Expressions").

  • 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.A method introduced in a class or struct hides properties, fields, and types that share that name in the base class. También oculta todos los métodos de la clase base que tienen la misma signatura.It also hides all base class methods that have the same signature.

  • Un indizador introducido en una clase o struct oculta todos los indizadores de la clase base que tienen la misma signatura.An indexer introduced in a class or struct hides all base class indexers that have the same signature.

Es un error usar new y override en el mismo miembro, porque los dos modificadores tienen significados mutuamente excluyentes.It is an error to use both new and override on the same member, because the two modifiers have mutually exclusive meanings. El modificador new crea un nuevo miembro con el mismo nombre y oculta el miembro original.The new modifier creates a new member with the same name and causes the original member to become hidden. El modificador override amplía la implementación de un miembro heredado.The override modifier extends the implementation for an inherited member.

Si se utiliza el modificador new en una declaración que no oculta un miembro heredado, se genera una advertencia.Using the new modifier in a declaration that does not hide an inherited member generates a warning.

EjemploExample

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.In this example, a base class, BaseC, and a derived class, DerivedC, use the same field name x, which hides the value of the inherited field. El ejemplo muestra el uso del modificador new.The example demonstrates the use of the new modifier. También muestra cómo obtener acceso a los miembros ocultos de la clase base mediante sus nombres completos.It also demonstrates how to access the hidden members of the base class by using their fully qualified names.

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
*/

EjemploExample

En este ejemplo, una clase anidada oculta una clase que tiene el mismo nombre en la clase base.In this example, a nested class hides a class that has the same name in the base class. 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.The example demonstrates how to use the new modifier to eliminate the warning message and how to access the hidden class members by using their fully qualified names.

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:If you remove the new modifier, the program will still compile and run, but you will get the following warning:

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

Especificación del lenguaje C#C# Language Specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee Also

Referencia de C#C# Reference
Guía de programación de C#C# Programming Guide
Palabras clave de C#C# Keywords
Palabras clave de operadorOperator Keywords
ModificadoresModifiers
Control de versiones con las palabras clave Override y NewVersioning with the Override and New Keywords
Saber cuándo utilizar las palabras clave Override y NewKnowing When to Use Override and New Keywords