Compartilhar via


Modificador new (Referência de C#)

Quando usado como modificador de declaração, a palavra-chave new oculta explicitamente um membro herdado de uma classe base. Quando você oculta um membro herdado, a versão derivada do membro substitui a versão da classe base. Embora você possa ocultar membros sem usar o modificador de new, você recebe um aviso do compilador. Se você usar new para ocultar explicitamente um membro, este aviso é suprimido.

Para ocultar um membro herdado, declare-o quando a classe derivada usando o mesmo nome de membro, e modifique-o com a palavra-chave new. Por exemplo:

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

Nesse exemplo, BaseC.Invoke é oculto por DerivedC.Invoke. O campo x não foi afetado porque não está oculto por um nome semelhante.

O nome ocultado pela herança usa uma das seguintes formas:

  • Geralmente, uma constante, campo, propriedade, ou tipo que foi introduzido em uma classe ou estrutura oculta os membros da classe base que compartilham seu nome. Há casos especiais. Por exemplo, se você declarar um novo campo com o nome N para ter um tipo que não é invocável e um tipo base declara N para ser um método, o novo campo não oculta a declaração base na sintaxe de invocação. Consultar Especificação da linguagem C# por detalhes (consulte a seção “Pesquisa de membro” na seção “Expressões”).

  • Um método introduzido em uma classe ou estrutura oculta as propriedades, campos, e tipos que compartilham esse nome na classe base. Também oculta todos os métodos da classe base que possuem a mesma assinatura.

  • Um indexador introduzido em uma classe ou estrutura oculta todos os indicadores da classe base que possuem a mesma assinatura.

É um erro usar new e substituição no mesmo membro, porque os dois modificadores têm significados mutuamente exclusivos. O modificador new cria um novo membro com o mesmo nome e faz com que o membro original torne-se oculto. O modificador de override estende a implementação de um membro herdado.

Usar o modificador new em uma declaração que não oculte um membro herdado gera um aviso.

Exemplo

Nesse exemplo, uma classe base, BaseC, e uma classe derivada, DerivedC, usam o mesmo nome de campo x, que oculta o valor do campo herdado. O exemplo demonstra o uso do modificador new. Também demonstra como acessar os membros ocultos da classe base usando seus nomes totalmente qualificados.

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

Nesse exemplo, uma classe aninhada oculta uma classe que tem o mesmo nome na classe base. O exemplo demonstra como usar o modificador de new para eliminar a mensagem de aviso e como acessar os membros ocultos da classe usando seus nomes totalmente qualificados.

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 de new, o programa ainda compilará e executará, mas você receberá o seguinte aviso:

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

Especificação da Linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

Palavras-chave C#

Palavras-chave de operador (Referência de C#)

Modificadores (Referência de C#)

Controle de versão com as palavras-chave override e new (Guia de Programação em C#)

Quando usar as palavras-chave override e new (Guia de Programação em C#)

Conceitos

Guia de Programação em C#

Outros recursos

Referência de C#