Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”

3.311 visualizações

Publicada em

Palestra Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14” na trilha .NET da edição 2014 de Poerto Alegre. Neste ano de 2014, o evento está tendo edições nas três seguintes cidades: São Paulo, Florianópolis e Porto Alegre.
Na apresentação, eu abordei o projeto de codinome "Roslyn", que passou a ser chamado de Plataforma de compiladores .NET e sua evolução. Depois eu comentei sobre a evolução da plataforma ASP.NET e os componentes do ASP.NET vNext. Além disso, eu comentei das novidades do Visual Studio "14" CTP 4, cuja versão final deve ser lançada em meados do ano que vem, muito provavelmente como o Visual Studio 2015.
Finalmente, eu comentei sobre as principais novidades da próxima versão da linguagem de programação C#: C# 6. Sendo que algumas das novidades planejadas acabaram de ser prorrogadas pelo time de produto da Microsoft para uma próxima versão, provavelmente a linguagem C# 7, por uma questão de haver um tempo reduzido para o lançamento. Por enquanto, as novidades anunciadas que serão cortadas são construtores primários e expressões de declaração.

Publicada em: Tecnologia
0 comentários
5 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
3.311
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2.050
Ações
Compartilhamentos
0
Downloads
33
Comentários
0
Gostaram
5
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”

  1. 1. Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14” Rogério Moraes de Carvalho VITA Informática rogeriom.wordpress.com | @rogeriomc
  2. 2. Agenda Plataforma de compiladores .NET (“Roslyn”) e Visual Studio “14” Projeto “Roslyn” Evolução do projeto “Roslyn” ASP.NET vNext ASP.NET & ASP.NET vNext Visual Studio “14” CTP 4 Experiências mais ricas no Visual Studio “14”
  3. 3. Agenda Linguagem de programação C# 6 Estágio final de renovação da C# 6 Construtores primários Avanços em propriedades automáticas Atribuição de autoprops somente com get no construtor using estático await em blocos catch e finally Filtros de exceção Operadores nulos-condicionais Expressões nameof Expressões de declaração Expressões de corpo em membros de função Iniciadores de índice Literais binários e separadores de dígitos Interpolação de strings C# 7 C# 7
  4. 4. Projeto “Roslyn” O que é o projeto “Roslyn”? Nova implementação dos compiladores C# e Visual Basic Feita em C# e Visual Basic Com APIs públicas ricas Open source no CodePlex roslyn.codeplex.com Plataforma de compiladores .NET
  5. 5. Evolução do projeto “Roslyn” Início do projeto “Roslyn”, internamente na Microsoft jun 2009 Liberação do primeiro “Roslyn” Community Technology Preview (CTP) 19 out 2011 “Roslyn” June 2012 CTP (suporte ao VS 2010 SP1 e ao VS 2012 RC) 05 jun 2012 “Roslyn” September 2012 CTP (suporte somente ao VS 2012 RTM) 17 set 2012 No Keynote do dia 2 do Build 2014, o código-fonte do “Roslyn” foi aberto: roslyn.codeplex.com 03 abr 2014 Visual Studio "14" CTP 1 (version 14.0.21730.1.DP) 03 jun 2014 Visual Studio "14" CTP 2 (version 14.0.21901.1.DP) 08 jul 2014 Visual Studio "14" CTP 3 (version 14.0.22013.1.DP) 18 ago 2014 Visual Studio "14" CTP 4 (version 14.0.22129.1.DP) 06 out 2014
  6. 6. ASP.NET vNext O ASP.NET vNext é a próxima versão do ASP.NET Reconstruído do zero para criar uma pilha .NET leve e compositiva Unificação das APIs MVC, Web API e Web Pages Um único framework, denominado MVC 6, independente do System.Web.dll Compilação dinâmica, cross-platform e open source Usa o compilador “Roslyn” e executa em Mac OS X e Linux (projeto Mono) Agnóstico da plataforma de desenvolvimento e da hospedagem Não depende do Visual Studio (desenvolvimento) e nem do IIS (hospedagem) Pode usar um subconjunto do .NET Framework otimizado para a nuvem
  7. 7. ASP.NET & ASP.NET vNext Websites Serviços ASP.NET ASP.NETvNext Web Forms Signal R ASP.NET MVC 6 Web Pages MVC Web API Núcleo unificado
  8. 8. Visual Studio “14” CTP 4 ASP.NET vNext no Visual Studio “14” CTP 4 Inclui os pacotes alpha4 do ambiente de execução do ASP.NET vNext Executa em Windows, Mac OS X e Linux Mudanças na estrutura de projetos ASP.NET vNext em relação ao VS “14” CTP 3 .NET Framework vNext Contém o RyuJIT: próxima geração do compilador JIT Por enquanto, está sendo denominado .NET Framework 4.5.3 Preview Atualização do .NET Framework 4 e versões posteriores .NET Native Correções no suporte parcial ao WCF
  9. 9. Experiências mais ricas no Visual Studio “14” Integração com o “Roslyn” Experiências melhoradas em: IntelliSense “Refatoração” CodeLens Depuração Avanços em “refatoração” Melhorias em “refatorações” Renomeação Extração de método Duas novas “refatorações” Introdução de variável local Variável inline temporária
  10. 10. Estágio final de renovação da linguagem C# 6 Mudanças no conjunto de características da linguagem Mads Torgersen – Program Manager for the C# Language (01/10/2014) http://roslyn.codeplex.com/discussions/568820 Novos recursos na linguagem são secundários nesta versão Foco principal na primeira versão da plataforma de compiladores .NET (“Roslyn”) Características que estão sendo cortadas da linguagem C# 6 Construtores primários Expressões de declaração Há muito trabalho e esforço na implementação dos recursos cortados Prorrogados para uma próxima versão da linguagem C# (provavelmente: C# 7)
  11. 11. Construtores primários Parâmetros em classes e estruturas Classes e estruturas com parâmetros definem construtores primários Construtores primários simplificam a codificação public class Trilha { private readonly int _id; private readonly string _nome; public Trilha(int id, string nome) { _id = id; _nome = nome; } public int Id { get { return _id; } } public string Nome { get { return _nome; } } } public class Trilha(int id, string nome) { private readonly int _id = id; private readonly string _nome = nome; public int Id { get { return _id; } } public string Nome { get { return _nome; } } } C# 7 C# 7
  12. 12. Construtores primários Corpos de construtores primários Muitos construtores inicializam campos e propriedades automáticas Pode haver a necessidade de fazer outras coisas, como validar argumentos public class Trilha { private readonly int _id; private readonly string _nome; public Trilha(int id, string nome) { if (nome == null) throw new ArgumentNullException("nome"); _id = id; _nome = nome; } public int Id { get { return _id; } } public string Nome { get { return _nome; } } } public class Trilha(int id, string nome) { { if (nome == null) throw new ArgumentNullException("nome"); } private readonly int _id = id; private readonly string _nome = nome; public int Id { get { return _id; } } public string Nome { get { return _nome; } } } C# 7 C# 7
  13. 13. Construtores primários Construtores explícitos Tipos com construtores primários podem definir outros construtores Os outros construtores devem chamar o primário, de forma direta ou indireta public class Trilha { private readonly int _id; private readonly string _nome; public Trilha(int id, string nome) { if (nome == null) throw new ArgumentNullException("nome"); _id = id; _nome = nome; } public Trilha(string nome) : this(0, nome) { } public int Id { get { return _id; } } public string Nome { get { return _nome; } } } public class Trilha(int id, string nome) { { if (nome == null) throw new ArgumentNullException("nome"); } private readonly int _id = id; private readonly string _nome = nome; public Trilha(string nome) : this(0, nome) { } public int Id { get { return _id; } } public string Nome { get { return _nome; } } } C# 7 C# 7
  14. 14. Avanços em propriedades automáticas Iniciadores em propriedades automáticas Inicia o campo de apoio, ao invés de acessar o membro de função set Similar a campos, não podem referenciar o this (objeto ainda não inicializado) Ideais para serem usados junto com construtores primários public class Palestra { public Palestra(string titulo, DateTime inicio) { _titulo = titulo; _inicio = inicio; } private string _titulo; public string Titulo { get { return _titulo; } set { _titulo = value; } } private DateTime _inicio; public DateTime Inicio { get { return _inicio; } set { _inicio = value; } } } public class Palestra(string titulo, DateTime inicio) { public string Titulo { get; set; } = titulo; public DateTime Inicio { get; set; } = inicio; } C# 7
  15. 15. Avanços em propriedades automáticas Propriedades automáticas somente com get Nova possibilidade de propriedade automática somente com get Neste caso, o campo de apoio é declarado como readonly public class Trilha { public Trilha(int id, string nome) { _id = id; _nome = nome; } private readonly int _id; public int Id { get { return _id; } } private readonly string _nome; public string Nome { get { return _nome; } } } public class Trilha(int id, string nome) { public int Id { get; } = id; public string Nome { get; } = nome; } C# 7
  16. 16. Atribuição de autoprops somente com get em construtor Propriedades automáticas somente com get podem ser iniciadas em construtores public class Trilha { public Trilha(int id, string nome) { _id = id; _nome = nome; } private readonly int _id; public int Id { get { return _id; } } private readonly string _nome; public string Nome { get { return _nome; } } } public class Trilha { public Trilha(int id, string nome) { Id = id; Nome = nome; } public int Id { get; } public string Nome { get; } }
  17. 17. using estático Permite especificar uma classe estática numa cláusula using Os membros estáticos acessíveis ficam disponíveis sem a qualificação da classe using System; public class HomeController : Controller { public IActionResult Index() { ViewBag.NumeroNucleos = Environment.ProcessorCount; ... } } using System.Environment; public class HomeController : Controller { public IActionResult Index() { ViewBag.NumeroNucleos = ProcessorCount; ... } }
  18. 18. await em blocos catch e finally Em C# 5 não é possível usar await em blocos catch e finally Limitação significativa devido a uma dificuldade de implementação Em C# 6, apesar da complexa implementação interna, é possível Exception excecao = null; try { await repositorio.EstatisticasAsync(filtragem); } catch (Exception ex) { excecao = ex; } if (excecao != null) { await Logger.EscreverLogAsync(excecao); } else { await repositorio.LiberarRecursosAsync(); } try { await repositorio.EstatisticasAsync(filtragem); } catch (Exception ex) { await Logger.EscreverLogAsync(excecao); } finally { await repositorio.LiberarRecursosAsync(); }
  19. 19. Filtros de exceção Se o filtro for verdadeiro, então a captura é processada Caso contrário, a exceção não é capturada Recurso já disponível nas linguagens Visual Basic e F# try { palestras = repositorio.ConsultarPalestras().ToList(); } catch (FormatException ex) if (ex.Message.StartsWith("The DateTime")) { throw new RepositorioJsonException("Erro de formatação de data/horário na fonte de dados JSON.", ex); }
  20. 20. Operadores nulos-condicionais Operador nulo-condicional ? Permite acessar membros e elementos quando o receptor não for nulo Caso contrário, retorna nulo int? totalTrilhas = trilhas?.Length; // null se trilhas for null int totalTrilhas = trilhas?.Length ?? 0; // 0 se trilhas for null (combinado com o operador coalescente nulo) Trilha primeiraTrilha = trilhas?[0]; // null se trilhas for null int? totalPalestrasPrimeiraTrilha = trilhas?[0].Palestras?.Count(); // encadeamento de operadores nulo-condicionais
  21. 21. Expressões nameof Retorna uma string com o nome de algum elemento do programa Eventualmente é necessário, como nos seguintes exemplos: No lançamento de uma exceção ArgumentException ou ArgumentNullException Na implementação da interface INotifyPropertyChanged public class Trilha(int id, string nome) { { if (nome == null) throw new ArgumentNullException("nome"); } public int Id { get; } = id; public string Nome { get; } = nome; } public class Trilha(int id, string nome) { { if (nome == null) throw new ArgumentNullException(nameof(nome)); } public int Id { get; } = id; public string Nome { get; } = nome; }
  22. 22. Expressões de declaração Permite declarar variáveis locais no meio de uma expressão A declaração pode estar com ou sem um iniciador C# 7 DateTime inicio; if (DateTime.TryParse(sInicio, out inicio)) { termino = inicio.AddMinutes(50); } if (DateTime.TryParse(sInicio, out DateTime inicio)) { termino = inicio.AddMinutes(50); } TimeSpan tempoReal, tempoPlanejado; if ((tempoReal = termino - inicio) > (tempoPlanejado = TimeSpan.FromMinutes(50))) { TimeSpan tempoExcesso = tempoReal - tempoPlanejado; ... } if ((TimeSpan tempoReal = termino - inicio) > (TimeSpan tempoPlanejado = TimeSpan.FromMinutes(50))) { TimeSpan tempoExcesso = tempoReal - tempoPlanejado; ... } C# 7 C# 7 Os escopos dos exemplos são diferentes
  23. 23. Expressões de corpo em membros de função Métodos e similares ou propriedades somente com get e similares Declaração de membros de função com expressões lambda Mesma conveniência de expressões lambda com delegates public class Trilha(int id, string nome) { public int Id { get; } = id; public string Nome { get; } = nome; public override string ToString() { return Nome; } } public class Trilha(int id, string nome) { public int Id { get; } = id; public string Nome { get; } = nome; public override string ToString() => Nome; } public class Palestra { ... public DateTime Inicio { get; set; } public DateTime Termino { get { return Inicio.AddMinutes(50); } } } public class Palestra { ... public DateTime Inicio { get; set; } public DateTime Termino => Inicio.AddMinutes(50); }
  24. 24. Iniciadores de índice Nova sintaxe de iniciadores de dicionários e objetos com indexadores Notação mais elegante, com o índice entre colchetes Dictionary<int, string> descricoesNiveisPalestras = new Dictionary<int, string> { {100, "Conteúdo introdutório e de visão geral"}, {200, "Conteúdo intermediário"}, {300, "Conteúdo avançado"}, {400, "Conteúdo para especialista"} }; Dictionary<int, string> descricoesNiveisPalestras = new Dictionary<int, string> { [100] = "Conteúdo introdutório e de visão geral", [200] = "Conteúdo intermediário", [300] = "Conteúdo avançado", [400] = "Conteúdo para especialista" };
  25. 25. Literais binários e separadores de dígitos Literais binários pelo acréscimo do prefixo 0b Muito útil nas configurações de indicadores (flags) de estado Separadores de dígitos com caractere de sublinhado: _ Facilita a visualização de números com muitos dígitos Sejam estes números decimais, hexadecimais ou binários [Flags] public enum ParticipacoesPalestranteTdc { Tdc2013SaoPaulo = 1, Tdc2013Florianopolis = 2, Tdc2013PortoAlegre = 4, Tdc2014SaoPaulo = 8, Tdc2014Florianopolis = 16, Tdc2014PortoAlegre = 32, Tdc2013Todas = 7, Tdc2014Todas = 56, TdcTodas = 63 } [Flags] public enum ParticipacoesPalestranteTdc { Tdc2013SaoPaulo = 0b000_001, Tdc2013Florianopolis = 0b000_010, Tdc2013PortoAlegre = 0b000_100, Tdc2014SaoPaulo = 0b001_000, Tdc2014Florianopolis = 0b010_000, Tdc2014PortoAlegre = 0b100_000, Tdc2013Todas = 0b000_111, Tdc2014Todas = 0b111_000, TdcTodas = 0b111_111 }
  26. 26. Interpolação de strings Açúcar sintático para uma chamada do String.Format string duracao = string.Format( "{0:hh:mm} às {1:hh:mm}", palestra.Inicio, palestra.Termino ); string duracao = "{palestra.Inicio:hh:mm} às {palestra.Termino:hh:mm}";
  27. 27. Demo: Projeto ASP.NET vNext no Visual Studio “14” CTP 4 Criação de uma solução Tdc composta por 2 projetos Tdc.Web – ASP.NET vNext Empty Web Application Aplicação Web ASP.NET MVC para divulgar palestras do TDC Tdc.Dados – ASP.NET vNext Class Library Biblioteca de classes para acesso aos dados Modelo: entidades de dados Repositório: recuperação dos dados (armazenados em formato JSON)
  28. 28. Recursos adicionais Microsoft Developer Network .NET Compiler Platform ("Roslyn") msdn.microsoft.com/roslyn CodePlex (Projetos open source) .NET Compiler Platform ("Roslyn") roslyn.codeplex.com VisualStudio.com Visual Studio “14” CTPs www.visualstudio.com/en-us/downloads/ visual-studio-14-ctp-vs (Visual Studio “14” CTP 4 em 06/10/2014) Channel 9 TechEd North America 2014 channel9.msdn.com/Events/TechEd/ NorthAmerica/2014 The Future of Visual Basic and C# (Nível 300) The Future of .NET on the Server INTRODUCING (Nível 300) DEEP DIVE (Nível 400) dotnetConf 2014 Conferência online gratuita www.dotnetconf.net videos.dotnetconf.net

×