Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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
Ncomo tendo um tipo que não é invocável, e um tipo base declaraNcomo 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#.