Novidades do C# 7, 7.1, 7.2 e 7.3
Olá, neste artigo eu vou escrever um resumo das novidades que eu acho mais relevantes que vieram no C# nas versões 7, 7.1, 7.2 e 7.3.
Index:
out
Variables;- Tuples;
- Discards;
- Local functions
- Mais expression-bodied
throw
Expressionsasync
Método Maindefault
Literal expressions- Argumentos nomeados não finais
- Técnicas para escrever código eficiente e seguro
- Mais exemplos
out
Variables ↑
Antes.
1 | int result; |
Depois.
1 | if (int.TryParse(input, out var result)) |
Tuples ↑
Declaração de variáveis, antes.
1 | var result = new Tuple<bool, string>(false, "An error has occurred"); |
Depois.
1 | var result = (Successfully: false, Message: "An error has occurred"); |
Chamada de método, antes.
1 | var result = DoSomething(); |
Depois.
1 | var (successfully, message) = DoSomething(); |
Discards ↑
- não aloca memória;
- é write only;
variáveis out
que não serão usadas, antes.
1 | var successfully = int.TryParse(input, out var result); |
Depois.
1 | var successfully = int.TryParse(input, out _); |
variáveis em pattern matching que não serão usadas, antes.
1 | switch (true) |
Depois.
1 | switch (true) |
variáveis desconstruídas que não serão usadas, antes.
1 | var (successfully, message) = DoSomething(); |
Depois.
1 | var (successfully, _) = DoSomething(); |
Local functions ↑
- pode ser
async
; - pode usar iterators com
yield
; - pode conter outra função local;
- pode conter um bloco ou uma expressão;
- pode ser genérica e pode restringir os tipos genéricos;
- pode usar variáveis e parâmetros genéricos que estejam no escopo da função que ela foi criada;
- pode usar parâmetros
ref
eout
; - não pode mudar o fluxo da função externa, por exemplo com uso de
goto
,break
,continue
e etc; - não causam alocações locais como declaração de
Func
ouAction
;
Antes.
1 | public void LogInfo(in string message) |
Depois.
1 | public void LogInfo(string message) |
Mais expression-bodied ↑
Esta feature feio da versão 6, e na versão 7 eles adicionaram em construtures, finalizadores e propriedades.
Antes.
1 | public class User |
Depois.
1 | public class User |
throw
Expressions ↑
Agora podemos utilizar throw
em uma operação de null coalesce e em expression bodied members.
Antes.
1 | public class User |
Depois.
1 | public class User |
async
Método Main ↑
Antes.
1 | public class Program |
Depois.
1 | public class Program |
default
Literal expressions ↑
Em parâmetros opcionais, antes.
1 | public class User |
Depois.
1 | public class User |
Argumentos nomeados não finais ↑
Antes.
1 | UpdateUser(id: 1, name: name); |
Depois.
1 | UpdateUser(id: 1, name); |
Técnicas para escrever código eficiente e seguro ↑
in
o parâmetro é passado por referência só que readonly;ref
o parâmetro é passado por referência read and write;ref readonly
o retorno do método é por referência e não pode ser alterado;struct readonly
a estrutura é readonly evitando quando um método é acessado uma cópia desnecessária;protected internal
permite classes derivadas ou no mesmo assembly;private protected
permite classes derivadas e no mesmo assembly;
nota: Pattern Matching terá um artigo só para ele, e será sempre atualizado com as novas versões do C#.
Mais exemplos ↑
Abaixo uma lista de projetos que você pode ver as novidades do C# em exemplos reais.
♟ Chess é uma console app feita com ASCII art.
🐷 Hawk (api) é sistema de finança pessoal.
Http.Query.Filter é uma lib para fazer filtros baseado no StrongLoop da IBM.
Obrigado pela visita 🙂!