Minha versão da explicação vem do uso de propriedades para ajudar a entender as diferenças.
overrideé simples o suficiente, certo? O tipo subjacente substitui o pai.
newé talvez o enganador (para mim era). Com propriedades, é mais fácil entender:
public class Foo
{
public bool GetSomething => false;
}
public class Bar : Foo
{
public new bool GetSomething => true;
}
public static void Main(string[] args)
{
Foo foo = new Bar();
Console.WriteLine(foo.GetSomething);
Bar bar = new Bar();
Console.WriteLine(bar.GetSomething);
}
Usando um depurador, você pode perceber que Foo foopossui 2 GetSomething propriedades, pois na verdade possui 2 versões da propriedade, FooeBar ' s, e saber qual usar, C # 'picaretas' a propriedade para o tipo atual.
Se você quisesse usar a versão da barra, você teria usado a substituição ou a Foo foosubstituição.
Bar bartem apenas 1 , pois deseja um comportamento completamente novoGetSomething .
newcria um novo membro com o mesmo nome e faz com que o membro original para ficar escondido, enquantooverrideestende a implementação de um membro herdado"