Fala, galera!
Em abril foi lançada a mais nova versão do Visual Studio 2019, e com esta nova versão veio o C# 8.0.
Neste artigo mostrarei as novas funcionalidades do C# 8.0 e veremos como o C#, a cada versão que vem sendo lançado, fica mais poderoso.
Quer saber mais sobre o Visual Studio 2019? Leia este artigo, onde eu apresento uma visão geral sobre essa fantástica IDE.
- 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, precisaremos habilitar dentro do VS 2019. Para isso, vá até as propriedades do seu projeto, escolha a opção Build e clique em Advanced.
Em seguida, 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 “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 a seguir:
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 enxutos nossos Switch Cases.
Veja no exemplo:
var result = operation switch
{
"+" => a + b,
"-" => a - b,
"/" => a / b,
"*" => a * b,
_ => throw new ArgumentException("Operação não encontrada")
};
Também 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, o qual visa facilitar a implementação de expressões que utilizam propriedades de um determinado objeto.
Confira a seguir como podemos utilizá-lo:
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, facilitando cada vez mais nosso dia a dia.
Abraços e até a próxima!