Fala Galera,
Em abril foi lançado a mais nova versão do Visual Studio 2019 e com esta nova versão veio o C# 8.0. Neste artigo estarei mostrando as novas funcionalidades do C# 8.0 e como o C# a cada versão que vem sendo lançado vai ficando mais poderoso.
Quer saber mais sobre o Visual Studio 2019, leia meu artigo que dou um overview sobre esta fantástica IDE clicando aqui
Antes de tudo! Habilite as novas funcionalidades do C# 8 no Visual Studio 2019
Para que você consiga utilizar os novos recursos do C# 8.0, precisamos habilitar dentro do VS 2019. Para isso vá em nas propriedades do seu projeto escolha a opção Build e clique em Advanced
Após selecione na combo, C# 8.0 (Beta) ou unsupported preview of next C# version (preview)
1 – Range e Index
Com o novo C# 8.0 não precisamos mais usar o System.Linq para fazer Slice de Array. Podemos agora com os novos tipos Range e Index selecionar um intervalo de itens dentro de um Array. Veja no exemplo abaixo:
public class RangeSample { static void Main(string[] args) { string[] techs = new string[] { "ASP.NET", ".NET Core", "SignalR", "Azure", "C#", "Docker", "Visual Studio", "Visual Studio Code" }; //Retornando elementos dos índices 1 a 5 foreach (var item in techs[1..5]) Console.WriteLine($"{item}"); //Retornando elementos da posição 1 até o penúltimo foreach (var item in techs[1..^1]) Console.WriteLine($"{item}"); //Retornando até o elemento da posição 5 foreach (var item in techs[..5]) Console.WriteLine($"{item}"); //Podemos utilizar o tipo Range e usá-lo como variável Range range = 0..6; foreach (var item in techs[range]) Console.WriteLine($"{item}"); //Podemos utilizar também o Tipo Index Index last = ^1; Console.WriteLine(techs[last]); } }
2 – Async ForEach
Foi introduzido um novo tipo chamado de IAsyncEnumerable e com isso podemos tornar nossas coleções assíncronas. Agora também nesta nova versão podemos utilizar o Keyword await em ForEach. Veja no exemplo abaixo:
public class AsyncForEach { public struct Data { public Data(int value1, int value2) => (Value1, Value2) = (value1, value2); public int Value1 { get; set; } public int Value2 { get; set; } } public static async IAsyncEnumerable<Data> GetDataAsync() { var r = new Random(); for (int i = 0; i < 10; i++) { await Task.Delay(100); yield return new Data(r.Next(100), r.Next(100)); } } public static async Task DemoAsync() { await foreach (var x in AsyncForEach.GetDataAsync()) { Console.WriteLine($"{x.Value1} {x.Value2}"); } } }
3 – Switch Expressions
Nesta nova versão do C# 8.0 temos o Switch Expression que é uma forma poderosa de você fazer cases. Com essa nova Feature do C# podemos criar expressões poderosas para cada situação e deixar mais enxuto nossos Switch Case. Veja no exemplo:
var result = operation switch { "+" => a + b, "-" => a - b, "/" => a / b, "*" => a * b, _ => throw new ArgumentException("Operação não encontrada") };
Podemos utilizar o Switch Expressions para operações de Tuplas, veja como fica poderoso o Switch
public enum State { Open, Closed, } public static State GetState((State, State) state, bool warning = false) { return state switch { (State.Open, State.Open) when warning => State.Closed, (State.Open, State.Open) => State.Open, (State.Open, State.Closed) => State.Closed, (State.Closed, State.Closed) => State.Closed, (_, _) => State.Closed }; }
4 – Property Patterns
Ainda falando em Switch Expressions, temos o Property Patterns no qual visa facilitar a implementação de expressões que utilizam propriedades de um determinado objeto. Veja no exemplo abaixo como podemos utilizar
public class Address { public string State { get; set; } public decimal CalcularTaxa(decimal salePrice) { return this switch { { State: "RJ" } => salePrice * 0.06M, { State: "SP" } => salePrice * 0.75M, { State: "MG" } => salePrice * 0.05M, _ => 0M }; } }
5 – Declarações Using
Podemos utilizar o Keyword using para informar ao compilador que a variável que está sendo declarada deve ser removida no final do escopo. Isso deixa nosso código muito mais legível pois não precisamos ficar abrindo bloco de using a todo instante. Veja o exemplo
public class UsingSample { public void EscreverNoArquivo(IEnumerable<string> lines) { using var file = new System.IO.StreamWriter("file.txt"); foreach (string line in lines) { file.WriteLine(line); } } }
A variável “file” será descartada no final da execução do método “EscreverNoArquivo”
Espero que vocês gostem dessas novas funcionalidades do C# 8.0 e a cada nova versão a linguagem fica mais poderosa e facilitando o nosso dia-dia.
Abs e até a próxima