novo modificador (Referência C#)

Quando usada como um modificador de declaração, a new palavra-chave 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. Isso pressupõe que a versão de classe base do membro é visível, pois já estaria oculta se fosse marcada como private ou, em alguns casos, internal. Embora você possa ocultar ou protected membros sem usar o new modificador, você recebe um aviso do public compilador. Se você usar new para ocultar explicitamente um membro, ele suprimirá esse aviso.

Você também pode usar a new palavra-chave para criar uma instância de um tipo ou como uma restrição de tipo genérico.

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

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

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

O nome ocultado por herança assume uma das seguintes formas:

  • Geralmente, uma constante, campo, propriedade ou tipo que é introduzido em uma classe ou struct oculta todos os membros da classe base que compartilham seu nome. Há casos especiais. Por exemplo, se você declarar que um novo campo com nome N tem um tipo que não é invocável e um tipo base declara N ser um método, o novo campo não oculta a declaração base na sintaxe de invocação. Para obter mais informações, consulte a seção Pesquisa de membros da especificação da linguagem C#.

  • Um método introduzido em uma classe ou struct oculta propriedades, campos e tipos que compartilham esse nome na classe base. Ele também oculta todos os métodos de classe base que têm a mesma assinatura.

  • Um indexador introduzido em uma classe ou struct oculta todos os indexadores de classe base que têm a mesma assinatura.

É um erro usar ambos new e substituir o mesmo membro, porque os dois modificadores têm significados mutuamente exclusivos. O new modificador cria um novo membro com o mesmo nome e faz com que o membro original fique oculto. O override modificador estende a implementação para um membro herdado.

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

Exemplos

Neste exemplo, uma classe base, BaseC, e uma classe derivada, DerivedC, usam o mesmo nome xde campo , que oculta o valor do campo herdado. O exemplo demonstra o uso do new modificador. Ele 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
*/

Neste exemplo, uma classe aninhada oculta uma classe que tem o mesmo nome na classe base. O exemplo demonstra como usar o new modificador 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 new modificador, o programa ainda será compilado e executado, 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 seção O novo modificador da especificação da linguagem C#.

Consulte também