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 Locais. Essas 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
Por incrível que pareça o Records foi o que eu achei mais interessante pois isto é um saco de fazer sempre na criação desse tipo de classes e que em todos os sistemas é necessário fazer.
Abraço.
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!