Dev (Back & Front)ARTIGO

C# 8.0 – Conheça suas novas funcionalidades

Neste artigo, Rafael Cruz apresenta as novas funcionalidades do C# 8.0 e mostra como o C#, a cada versão que vem sendo lançado, fica mais poderoso.

C# 8.0 – Conheça suas novas funcionalidades
Imagem: Rafael Cruz

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!

Rafael CruzAutor

Rafael Cruz é Partner e Lead Software Architect na Electric Dreams, Professor Universitário, Most Valuable Profissional (MVP), Instrutor Oficial Microsoft (MCT), Fundador do Coders in Rio, Pós graduado em Engenharia de Software pela UFRJ. Atua como palestrante e autor em portais voltado para tecnologia Microsoft com foco em Web, Cloud e Mobile

Ver perfil