Modificador new (referência em C#)

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

Você também pode usar a palavra-chave new 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 palavra-chave new. Por exemplo:

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. O campo x não é afetado porque não é ocultado por um nome semelhante.

A ocultação de nome por meio da herança assume uma das seguintes formas:

  • 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. Há casos especiais. 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. Para obter mais informações, consulte a seção Pesquisa de membro na 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 da 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 new e override 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 seja ocultado. O modificador override estende a implementação de um membro herdado.

Usar o modificador new 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 do campo x, que oculta o valor do campo herdado. O exemplo demonstra o uso do modificador new. 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 modificador new para eliminar a mensagem de aviso e como acessar os membros da classe oculta 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 new, 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 modificador new na especificação da linguagem C#.

Confira também