O novo recurso target-typed new expressions do C# 9.0, que tem suporte no .NET 5.0, permite simplificar o código nas instruções para instanciar objetos. Um Target-typed ou Tipo de destino significa que uma expressão obtém o tipo do contexto em que é usada.
Com C# 9.0, a nova expressão obtém o tipo do contexto, o que significa que você não precisa especificar o tipo de destino explicitamente para chamar um construtor. Vejamos isso funcionando com um exemplo simples.
1- Criando novos objetos antes do C# 9.0
Temos neste código o exemplo clássico da criação de objetos.
No código acima temos o construtor padrão e o construtor com parâmetros nome e sobrenome para inicializar as propriedades Nome Sobrenome.
Para criar instâncias de um objeto podemos usar o construtor padrão ou usar o construtor parametrizado. Além disso podemos usar a palavra-chave var.
Agora, em todos os casos, você pode ver que a nova expressão – que é a parte do lado direito do sinal = – sempre requer o nome da classe.
Pois com o C# 9.0 isso não será mais preciso se o tipo de destino já for conhecido do lado esquerdo do sinal de igual (=) que é sempre o caso se você não usar a palavra-chave var no lado esquerdo do sinal =.
Usando o recurso Target-typed New Expression
Com o C# 9.0, você pode criar um novo objeto do tipo Cliente como mostrado a seguir com a nova expressão especificada no destino para chamar o construtor padrão.
Observe que não estamos especificando a classe Cliente no lado direito do sinal =, o compilador a obtém do lado esquerdo do sinal =.
O recurso só não vai funcionar com o uso da palavra-chave var:
Assim o recurso não funciona com com a palavra-chave var, porque então o compilador não terá a chance de descobrir o tipo que você deseja criar.
E como devem funcionar um construtor com parâmetros opcionais ?
Qual será o comportamento ?
Chamar esse construtor com a nova expressão com tipo de destino funciona exatamente da mesma maneira que você faria com uma nova expressão clássica, basta omitir o nome da classe no lado direito do sinal =.
Assim podemos ter as seguintes opções :
- Podemos chamar o construtor padrão;
- Podemos chamar o construtor usando os dois parâmetros;
- Podemos chamar o construtor usando apenas o primeiro parâmetro;
- Podemos também usar argumentos nomeados para chamar o construtor usando apenas o sobrenome;
- O recurso continua não funcionando com a palavra-chave var;
Existem outros aspectos que devemos considerar ao usar este recurso mas isso fica para outro artigo.