![]()  | 
    Neste artigo vou apresentar as novidades da versão 7.x da linguagem C#. | 
				
				![]()  | 
  
Tuplas
Tuplas permitem combinar objetos de diferentes tipos. Antes do C# 7, as tuplas já faziam parte do .NET Framework com a classe Tuple. Os membros da tupla podem ser acessados com Item1, Item2, Item3, e assim por diante. No C# 7, as tuplas fazem parte da linguagem C# e você pode definir os nomes dos membros.
Assim, embora as tuplas estivessem disponíveis antes do C# 7.0, elas eram ineficientes e não tinham nenhum suporte de linguagem. Isso significava que os elementos de tupla só podiam ser referenciados como Item1, Item2 e assim por diante.
O C# 7.0 introduz o suporte de linguagem para tuplas, que permite nomes semânticos para os campos de uma tupla, usando tipos de tupla novos e mais eficientes.
| 
			
			
			var t1 = Tuple.Create(42, "teste"); int i1 = t1.Item1; string s1 = t1.Item2;  | 
			
			
			 var t1 = (n: 42, s: 
			teste"); int i1 = t1.n; string s1 = t1.s;  | 
		
| C# 6.0 | C# 7.0 | 
Em uma atribuição de tupla, você também pode especificar os nomes dos campos no lado direito da atribuição: var alfabeto = (Alfa: "a", Beta: "b");
Os novos recursos de tuplas exigem os tipos ValueTuple. Você deve adicionar o pacote NuGet System.ValueTuple para usá-lo em plataformas que não incluem os tipos.
Nomes de Tuplas inferidas
O C# 7.1 estende as tuplas inferindo automaticamente os nomes das tuplas, semelhantes aos tipos anônimos. Com o C# 7.0, os membros da tupla sempre precisam ser nomeados.
Caso o membro da tupla tenha o mesmo nome da propriedade ou campo que você atribui a ele, com o C# 7.1, se o nome não for fornecido, ele terá o mesmo nome que o membro designado:
| 
			
			
			  var t1 = (Nome: corredor.Nome, Vencedor: corredor.Vencedor); int vencedor = t1.Vencedor;  | 
			C# 7.0 | 
| 
			
			  var t1 = 
			(corredor.Nome, corredor.Vencedor); int wins = t1.Vencedor;  | 
			C# 7.1 | 
Deconstructors
Não, isso não é um erro de digitação. Os desconstrutores não são destructors.
Basicamente, o que um Construtor faz é criar um novo objeto de determinado tipo com determinados parâmetros (aqui estou optando pelo construtor padrão, pois não possui parâmetros).
Então, o que o Desconstrutor deve fazer é desconstruir o objeto de volta às suas partes originais.
Para ser específico, você tem o controle de especificar como você gostaria que o objeto fosse desconstruído.
| 
			
			public class Aluno { public string Nome { get; } public string Email { get; } public aluno(string nome, string email) { Nome = nome; Email = email; } public void Deconstruct(out string nome, out string email) { nome = Nome; email = Email; } }  | 
		
| C# 7.0 | 
	
	Correspondência de Padrões
	
	Com a correspondência de padrões, o operador is e a instrução 
	switch foram aprimoradas com três tipos de padrões: o padrão
	
	const, o padrão de  type 
	e o padrão  var. 
	
	O trecho de código abaixo à esquerda mostra padrões com o operador is. 
	
Usando o padrão type e o padrão var, uma variável pode ser declarada para acesso fortemente tipado:
| 
			
			public void PadroesComOperadorIs(object o) { if (o is 42) { } if (o is Pessoa p) { } if (o is var v1) { } }  | 
			
			
			public void 
			PadroesComOperadorSwitch(object o) { swtich (o) { case 42: break; case Pessoa p when p.Nome == "Macoratti": break; case Pessoa p: break; case var v: break; } }  | 
		
| C# 7.0 | C# 7.0 | 
Acima à direita temos um exemplo usando a instrução switch, você pode usar os mesmos padrões com a cláusula case, e , também pode declarar uma variável para ser fortemente tipada caso o padrão corresponda; além disso você pode usar when para filtrar o padrão em um condição:
Throw Exceptions
O 
	lançamento de exceções somente era possível com uma instrução; não era 
	possível em uma expressão. Assim, quando você recebia um parâmetro com um 
	construtor, verificações extras para null eram 
	necessárias para lançar um ArgumentNullException.
	
	
	Com o C# 7, as exceções podem ser lançadas em expressões, portanto, é 
	possível lançar o ArgumentNullException quando 
	o lado esquerdo for nulo - usando o
	operador de coalescência.
	
			private readonly ILivrosService _livrosService;
public LivroController(LivrosService livrosService)
{
   if (livrosService == null)
   {  
      throw new ArgumentNullException(nameof(b));
   }
   _livrosService = livrosService;
}
			 | 
		
| C# 6.0 | 
| 
			private readonly ILivrosService _livrosService; public LivroController(LivrosService livrosService) { _livrosService = livrosService ?? throw new ArgumentNullException(nameof(b)); }  | 
		
| C# 7.0 | 
Com o C# 7.2, agora é permitido ter argumentos nomeados também após os posicionados. Esse recurso é chamado de : argumentos nomeados sem rastreio.
Async Main
Antes do C# 7.1, o método Main sempre precisava ser declarado do tipo void. Com o C # 7.1, o método Main também pode ser do tipo Task e usar as palavras-chave async e await:
			static void Main()
{
        Metodo1Async().Wait();
}
			 | 
			
			async static Task Main()
{
    await MetodoAsync();
}
			 | 
		
| C# 7.0 | C# 7.1 | 
Semântica de Referência
O 
	.NET Core tem um grande foco em melhorar o desempenho. Adições aos recursos 
	do C# para semântica de referência ajudam a aumentar o desempenho. 
	
	Antes do C# 7, a palavra-chave  ref poderia ser 
	usada com parâmetros para passar tipos de valor por referência. 
	
Agora 
	também é possível usar a palavra-chave  ref com 
	o tipo de retorno e com variáveis locais.
	
	O trecho de código a seguir declara o método  GetNumero 
	para retornar uma referência a um  int. 
	
Desta forma, o chamador tem acesso direto ao elemento na matriz e pode alterar seu conteúdo:
			int[] _numeros= { 3, 7, 11, 15, 21 };
public ref int GetNumero(int index)
{
    return ref _numeros[index];
}
			 | 
		
| C# 7.0 | 
Com o C# 7.2, o modificador readonly pode ser adicionado aos retornos ref. Desta forma, o chamador não pode alterar o conteúdo do valor retornado, mas a semântica de referência é usada, e uma cópia do tipo de valor quando retornando o resultado pode ser evitado.
O chamador recebe uma referência, mas não pode alterá-lo:
			int[] _numeros= { 3, 7, 11, 15, 21 };
public ref readonly int GetNumero(int index)
{
    return ref _numeros[index];
}
			 | 
		
| C# 7.2 | 
Antes do C# 7.2, o C# poderia criar tipos de referência (uma classe) e tipos de valor (uma estrutura). No entanto, a estrutura também poderia ser armazenada na heap quando o boxing tivesse ocorrido.
Com o C# 7.2, um tipo pode ser declarado como sendo somente permitido na pilha: ref struct:
			ref struct SomenteOnTheStack
{
}
			 | 
		
| C# 7.2 | 
Concluimos assim a apresentação das novidades principais da versão 7.0, 7.1 e 7.2 da linguagem C#.
Em breve estarei detalhando cada uma das novidades com mais exemplos práticos.
	"Não pergunteis, pois, que haveis de comer, ou que haveis de beber, e não 
	andeis inquietos."
	"Porque as nações do mundo buscam todas essas coisas; mas vosso Pai sabe que 
	precisais delas."
	"Buscai antes o reino de Deus, e todas estas coisas vos serão 
	acrescentadas."
	
	Lucas 12:29-31
| 
	
    
    Veja os 
    Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique 
	e confira ! 
 Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?  | 
  
  
    Gostou ?  
Compartilhe no Facebook
  
 
Compartilhe no Twitter
  
  
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Visual Studio - Dica de produtividade - Quick Launch - Macoratti.net
Visual Studio - Dica de produtividade - Nuget - Macoratti.net
Terminal de linha de comando - Macoratti
Criando um serviço do Windows - Macoratti
C# - Tratando com serviços do Windows - Macoratti
C# - Agendando Tarefas no Windows - Macoratti
C# - Criando serviços para Windows com o TopShelf - Macoratti