Partilhar via


novo modificador (Referência C#)

Quando usas a new palavra-chave como modificador de declaração, escondes explicitamente um membro que uma classe base fornece. Quando você oculta um membro herdado, a versão derivada do membro substitui a versão da classe base. Podes esconder um membro quando a versão da classe base estiver visível na classe derivada. A versão da classe base não é visível se estiver marcada como private ou, em alguns casos, internal. Embora você possa ocultar ou public membros sem usar o protected modificador, você recebe um aviso do new compilador. Se você usar new para ocultar explicitamente um membro, ele suprimirá esse aviso.

A referência da linguagem C# documenta a versão mais recentemente lançada da linguagem C#. Contém também documentação inicial para funcionalidades em versões preliminares públicas para a próxima versão da linguagem.

A documentação identifica qualquer funcionalidade introduzida pela primeira vez nas últimas três versões da língua ou em pré-visualizações públicas atuais.

Sugestão

Para saber quando uma funcionalidade foi introduzida pela primeira vez em C#, consulte o artigo sobre o histórico de versões da linguagem C#.

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á escondido por um nome semelhante.

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

  • Geralmente, uma constante, campo, propriedade ou tipo que introduz numa classe ou struct esconde todos os membros da classe base que partilham o seu nome. No entanto, existem alguns casos especiais. Por exemplo, se declarares um novo campo com nome N como tendo um tipo que não é invocável, e um tipo base declara N como método, o novo campo não esconde 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 que introduz numa classe ou struct esconde propriedades, campos e tipos que partilham esse nome na classe base. Ele também oculta todos os métodos de classe base que têm a mesma assinatura.

  • Um indexador que introduz numa classe ou struct esconde todos os indexadores da classe base que tenham a mesma assinatura.

É um erro usar ambos new e sobrescrever no mesmo elemento, 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 numa declaração que não esconde 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 remover o new modificador, o programa continua a compilar e a correr, mas recebe 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#.

Ver também