Back-End

16 mai, 2019

C# 8.0 – Conheça suas novas funcionalidades

Publicidade

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!