O que vem de novo para o C#?

William Goulardt Cardozo
CWI Software
Published in
5 min readDec 14, 2017

É tanta atualização de framework e linguagens que às vezes se torna meio complicado de acompanhar tudo. Então eu resolvi fazer um compilado de novidades (algumas nem tão novas) interessantes que estão vindo no C# para compartilhar com vocês.

Pattern Matching

Antes do pattern matching no C# quando tínhamos que utilizar algum valor ou método de uma classe filha onde recebíamos uma classe pai por parâmetro, primeiramente a gente verificava se o objeto era daquele tipo e depois fazíamos um cast para o mesmo.

Exemplo de código com herança antes do Pattern Matching

O C# 7 trouxe uma otimização de escrita de código para isso. A grande sacada é que agora podemos dentro de um if, ou em um case de um switch, colocar uma variável para o tipo que queremos, e se passar na clausula do is ele automaticamente vai fazer o cast para o objeto.

Exemplo de código com herança após o Pattern Matching

Também podemos utilizar o is para verificação de nulos agora, o que deixa a leitura do código muito mais verbosa.

Exemplo de código utilizando is para verificar referencias nulas

Throw Expression

Hoje existe a necessidade de validar certos objetos antes de realizar qualquer tipo de persistência de dados, com as throw expressions podemos adicionar exceções em expression-bodied members “=>”, null-coalescing expressions “??” e conditional expressions “?:”.

Exemplo de código antes de existir throw expressions
Exemplo de código utilizando throw expressions

Notem que no segundo exemplo eu consegui logo validar a inexistência do carrinho logo após a consulta utilizando a null-coalescing expressions “??”, sem a necessidade de criar um if.

Local Functions

Agora também podemos ter métodos dentro de métodos no C#. Acho que isso pode ajudar a esconder certos métodos privados que eram criados apenas para atender a um único método.

Exemplo de código não criativo utilizando Local Functions

Tuples

As tuplas servem para guardar um conjunto temporário de valores. No C# elas existem já tem um tempo, porém só agora na versão 7 elas se tornaram viáveis, elas foram reformuladas e tivemos uma melhoria que facilita a criação e leitura delas.

Método criando uma tupla no formato antigo
Método criando uma tupla no formato atual

Agora podemos dar nome a cada um dos tipos que colocamos na Tupla, isso deixa a criação dela mais legível, e podemos utilizar esses nomes para acessar cada um dos valores após ela ser criada.

Exemplo de utilização das Tuplas

Deconstructors

Essa parte de dar nome aos tipos na tupla está diretamente ligado aos deconstructors que é outra feature que chegou com o C# 7, com ele podemos acessar as tuplas e objetos de diversos formas.

Exemplo de tuple-deconstruction

Quando utilizamos o “_” significa que não nos importamos com o valor que venha naquela posição da tupla. Para realizarmos desconstrução de objetos precisamos criar um método especifico nele chamado Deconstruct.

Exemplo de Deconstructor

Com esse método criado na classe podemos acessar os valores da mesma forma que acessamos nas tuplas. Pode ser interessante quando não queremos carregar todos os dados do objeto na memória. Podemos também criar overloads do deconstructor para utilizarmos em situações especificas, isso faz com que não seja necessário colocarmos vários “_” só por que não precisamos de um valor que foi colocado no decostructor que outro método utiliza.

Exemplo de object-deconstruction

Non-Nullable References

O C# 8 que ainda não está disponível deve ter algumas features que vão mudar a forma como programamos hoje, uma das propostas apresentadas é a Non-Nullable References.

A ideia é fazer com que até tipos complexos não possam mais ser instanciados como null, fazendo com que NullReferencesExceptions sejam convertidas em erros de compilação.

Exemplo criado pela Microsoft para mostrar como vai funcionar as Non-Nullable References

Como podemos ver no exemplo, agora também precisaremos da nullable reference “?” para tipos complexos caso seja necessário dizer que aquela variável ou propriedade pode ser nula.

Link do github que detalha a proposta: https://gist.github.com/olmobrutall/31d2abafe0b21b017d56

Extensions

As Extensions também fazem parte das novas propostas, elas servirão para criarmos métodos de extensões de tipos como String, List, Dictionary sem que seja necessário criar aquela classe estática que tem um this no parâmetro do método para que o C# entenda que aquele método é uma extensão da classe.

As extensions devem se tornar algo próximo disso

A ideia ainda está bem crua, mas a comunidade está tentando fazer com que ela saia. Assisti a um vídeo do Program Manager da Microsoft dizendo que a feature pode vir para o C# 8, mas ainda não vi nenhuma movimentação na parte de propostas do C# 8 no Github para a mesma.

Link para o vídeo onde Mads Torgensen comenta de algumas features do C# 8, incluindo as extensions: https://channel9.msdn.com/Blogs/Seth-Juarez/A-Preview-of-C-8-with-Mads-Torgersen.

--

--

William Goulardt Cardozo
CWI Software

A future world traveller, passionate about games and programming ❤