Modificador new (referência em C#)new modifier (C# Reference)

Quando usada como um modificador de declaração, a palavra-chave new oculta explicitamente um membro herdado de uma classe base.When used as a declaration modifier, the new keyword explicitly hides a member that is inherited from a base class. Quando você oculta um membro herdado, a versão derivada do membro substitui a versão da classe base.When you hide an inherited member, the derived version of the member replaces the base class version. Embora possa ocultar membros sem usar o modificador new, você obtém um aviso do compilador.Although you can hide members without using the new modifier, you get a compiler warning. Se você usar new para ocultar explicitamente um membro, ele suprime o aviso.If you use new to explicitly hide a member, it suppresses this warning.

Para ocultar um membro herdado, declare-o na classe derivada usando o mesmo nome de membro e modifique-o com a palavra-chave 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 exemplo:For example:

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

Neste exemplo, BaseC.Invoke é ocultado por DerivedC.Invoke.In this example, BaseC.Invoke is hidden by DerivedC.Invoke. O campo x não é afetado porque não é ocultado por um nome semelhante.The field x is not affected because it is not hidden by a similar name.

A ocultação de nome por meio da herança assume uma das seguintes formas:Name hiding through inheritance takes one of the following forms:

Normalmente, uma constante, campo, propriedade ou tipo que é apresentado em uma classe ou struct oculta todos os membros da classe base que compartilham seu nome.Generally, a constant, field, property, or type that is introduced in a class or struct hides all base class members that share its name. Há casos especiais.There are special cases. Por exemplo, se você declarar que um novo campo com o nome N tem um tipo que não pode ser invocado e um tipo base declarar que N é um método, o novo campo não ocultará a declaração base na sintaxe de invocação.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. Consulte a Especificação da linguagem C# 5.0 para obter detalhes (consulte a seção "Pesquisa de membro" na seção "Expressões").See the C# 5.0 language specification for details (see section "Member Lookup" in section "Expressions").

Um método introduzido em uma classe ou struct oculta propriedades, campos e tipos que compartilham esse nome na classe base.A method introduced in a class or struct hides properties, fields, and types that share that name in the base class. Ele também oculta todos os métodos da classe base que têm a mesma assinatura.It also hides all base class methods that have the same signature.

Um indexador introduzido em uma classe ou struct oculta todos os indexadores de classe base que têm a mesma assinatura.An indexer introduced in a class or struct hides all base class indexers that have the same signature.

É um erro usar new e override no mesmo membro, porque os dois modificadores têm significados mutuamente exclusivos.It is an error to use both new and override on the same member, because the two modifiers have mutually exclusive meanings. O modificador new cria um novo membro com o mesmo nome e faz com que o membro original seja ocultado.The new modifier creates a new member with the same name and causes the original member to become hidden. O modificador override estende a implementação de um membro herdado.The override modifier extends the implementation for an inherited member.

Usar o modificador new em uma declaração que não oculta um membro herdado gera um aviso.Using the new modifier in a declaration that does not hide an inherited member generates a warning.

ExemploExample

Neste exemplo, uma classe base, BaseC e uma classe derivada, DerivedC, usam o mesmo nome do campo x, que oculta o valor do campo herdado.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. O exemplo demonstra o uso do modificador new.The example demonstrates the use of the new modifier. Ele também demonstra como acessar os membros ocultos da classe base usando seus nomes totalmente qualificados.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
*/

ExemploExample

Neste exemplo, uma classe aninhada oculta uma classe que tem o mesmo nome na classe base.In this example, a nested class hides a class that has the same name in the base class. O exemplo demonstra como usar o modificador new para eliminar a mensagem de aviso e como acessar os membros da classe oculta usando seus nomes totalmente qualificados.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
*/

Se você remover o modificador new, o programa ainda será compilado e executado, mas você receberá o seguinte aviso: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'.

Especificação da linguagem C#C# language specification

Para obter mais informações, consulte a Especificação da linguagem C#.For more information, see the C# Language Specification. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.The language specification is the definitive source for C# syntax and usage.

Consulte tambémSee also