Esse é o 12º post da série sobre C# 7, e o 2º sobre C# 7.1. Pra acompanhar a série você pode seguir a tag C#7 no blog ou voltar no post que agrega a série.

Lembrando que para utilizar as versões minor do C# (como a 7.1, ou 7.2) você precisa habilitá-la nos atributos do projeto. Veja neste post como fazê-lo e também como habilitar na solution inteira pra não ter que ficar configurando cada projeto individualmente.

Novidades do C# 7.1: Expressão literal default

A partir da versão 7.1 ficou mais fácil declarar valores default. Antes, você tinha que especificar o tipo inteiro, e agora pode usar somente a palavra-chave default. Isso segue na ideia de que, se o compilador puder adivinhar algo, então é melhor que ele o faça. Você digita menos, o código fica mais limpo, e nada é perdido.

É importante salientar que essa nova sintaxe não muda absolutamente nada no código final produzido, que fica idêntico ao que era produzido antes. Ou seja, não há qualquer argumento a respeito de diferença de desempenho, ela simplesmente não existe.

Veja como ficava:

Func<string, bool> onde = default(Func<string, bool>);

E como ficou no C# 7.1:

Func<string, bool> onde = default;

Para isso funcionar o compilador deve ser capaz de inferir o tipo, o que nem sempre é possível. Você não poderia usar var no exemplo acima. Se quisesse usar var, ainda teria que usar a forma antiga, por exemplo:

var onde = default(Func<string, bool>);

Os lugares onde você pode usar default são:

  1. inicializador de variáveis (como o exemplo acima);
  2. passagem de valor para variáveis;
  3. indicando o valor padrão para um paramêtro opcional;
  4. passagem de argumentos;
  5. retorno de funções.

No 2º caso (passagem de valor para variáveis):

Func<string, bool> onde;
onde = default;

No 3º caso (indicando o valor padrão para um parâmetro opcional):

void Funcao(int i, Func<bool> f = default) { }

No 4º caso (passagem de argumentos ao invocar uma função):

Funcao(default);

No 5º caso (retorno de funções):

string F() => default;

Esse é o típico exemplo de funcionalidade pequena e simples que tem um impacto razoável, já que o código fica mais limpo e gastamos menos tempo no teclado. É sem dúvida alguma fruto da reescrita do compilador do C# em C#, que permite essas pequenas evoluções, que saem quase de graça.

Você consegue ler sobre a expressão literal de default nos docs sobre default.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.