Uma visão sobre o C# 7.0

12 abr

Fala Galera,

Hoje estarei postando sobre as novas funcionalidades do C# 7.0 e explicando o que cada uma faz. Essas novidades foram apresentada na Build 2016 na sessão “The Future of C#”. Clique aqui para assistir.

Tuples

Essa não é bem uma novidade pois já existia tuplas no C# utilizando a classe Tuple. A grande novidade é como declarar o uso de tuplas ao invés de usar a declaração padrão da classe Tuple. Usamos a nova de declaração e dizemos quais serão os elementos que farão parte da tupla.

Veja o exemplo abaixo:

//Construtor padrão da Tuple
Tuple<int, int> scalarValue = new Tuple<int, int>(Numbers.Count(), Numbers.Sum());
Console.WriteLine($"Qtd:{scalarValue.Item1}, Soma:{scalarValue.Item2}");

//Criamos a tupla como variaveis
var tuple = (Quantidade: Numbers.Count(), Soma: Numbers.Sum());

// Podemos agrupar em variaveis independentes
(int Quantidade, int Soma) = (Numbers.Count(), Numbers.Sum());

// Ou assim
int Quantidade, Soma;
(Quantidade, Soma) = (Numbers.Count(), Numbers.Sum());

 

Local Functions

Agora no C# 7.0 temos a possibilidades de criar Funções LocaisEssas funções locais são criadas dentro de outra função. O escopo dessa função local está disponível enquanto a função principal estiver ativa ou seja em execução.

Veja o exemplo abaixo:

IEnumerable<int> FindTodosNumeroPar(int[] list)
{
   foreach (var item in list)
   {
      if (item % 2 == 0)
          yield return item;
   }
}

var x = FindTodosNumeroPar(Numbers);
foreach (var item in x)
   Console.WriteLine($"Numero par:{item}");
Console.ReadKey();

 

Ref Local e Ref Returns

Esta nova funcionalidade do C# traz a possibilidade de referenciar o ponteiro de memória ao invés do valor local e retornar este ponteiro em uma função (Ref Return). Também podemos criar Ref Local que seriam variáveis local dentro de uma função porém ao invés de passar o valor nós passaríamos o ponteiro de memoria.

Esse ponteiro de memoria estará referenciando um valor, logo se alteramos o valor aonde o ponteiro está apontando, o valor da variável local também irá mudar. É um pouco complicado de explicar contudo no exemplo será mais fácil o entendimento.

Veja o exemplo abaixo:

ref int Max(ref int x, ref int y)
{
     if (x > y)
          return ref x;
     return ref y;
}

int[] Numbers = new int[] { 12, 20, 13, 21, 24, 25 };
ref int result = ref Numbers[0];

for (int i = 0; i < Numbers.Length; i++)
       result = Max(ref result, ref Numbers[i]);

Console.WriteLine($"Maior número é :{result}");
Console.ReadKey();

 

Pattern Matching

Essa funcionalidade é bem interessante, o principal conceito dela é facilitar a checagem de tipos. Com a checagem de tipo realizada com sucesso podemos criar uma variável com base na checagem e usar esta variável no código. Essa funcionalidade irá facilitar muito quando tivermos código com if/else e switch e se faz necessário checagem de tipo.

Veja o exemplo:

void Soma(object[] list, ref int result)
{
  for (int i = 0; i < list.Count(); i++)
  {
       if (list[i] is int x) //Pattern Matching x
           result += x;
       else if (list[i] is object[] y) //Pattern Matching y
           Soma(y, ref result);
  }
}

var Numbers = new object[] { 12, 20, 13, new object[] { 21, 24, 25 }};
int total = 0;

Soma(Numbers, ref total);

Console.WriteLine($"Soma é :{total}");
Console.ReadKey();

 

Records

Essa funcionalidade foi criada para agilizar o processo de criação de classe que somente tem propriedades. Geralmente no nossos sistemas temos classes que somente tem propriedades, ou seja, são classes que armazenam valores e nada mais. Qual é o grande problema, temos que escrever muito quando esse tipo de situação acontece, declarar propriedade a propriedade, agora com a nova funcionalidade Records podemos declarar nossa classe em uma linha tornando nosso trabalho muito menos árduo.

Veja o exemplo

//Classe somente com gets and sets
public class Usuario
{
    public int Id { get; set; }
    public String Nome { get; set; }
    public String Email { get; set; }
}

//Mesma classe usando Records
public class Usuario(int id, String Nome, String Email);

 

Binary Literal

Essa funcionalidade traz o conceito no qual podemos criar expressões de valores binários e associar o valor em uma variável por exemplo do tipo inteiro.

Veja o exemplo

var Numbers = new int[] {0b010, 0b01001, 0b0011, 0b1101 };

foreach (var item in Numbers)
    Console.WriteLine($"Numeros são :{item}");
            
Console.ReadKey();

 

Essas são as novas funcionalidades que podem estar no novo C#, algumas funcionalidades estão listadas como “Muito Interesse” e “Menos Interesse”. Podemos ver essa listagem de funcionalidade e a classificação das funcionalidades através desse Ticket no GitHub.

Gostaram das novas funcionalidades ? Deixe seu comentário!

Abs e até o próximo

2 Replies to “Uma visão sobre o C# 7.0

    • Concordo com você, apesar de achar que a parte de tuplas e pattern matching será bem útil também.
      Pior que essas funcionalidades estão marcada como “interesse maior” mas isso não significa que estará na nova versão do C#.
      Abs e seja bem vindo ao meu blog!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *