Plataforma de compiladores .NET, C# 6 e Visual Studio 2015

2.349 visualizações

Publicada em

Palestra "Plataforma de compiladores .NET, C# 6 e Visual Studio 2015" apresentada no dia 25 de abril de 2015 no evento Global Azure Bootcamp 2015 da Microsoft.

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

Sem downloads
Visualizações
Visualizações totais
2.349
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1.304
Ações
Compartilhamentos
0
Downloads
28
Comentários
0
Gostaram
3
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Plataforma de compiladores .NET, C# 6 e Visual Studio 2015

  1. 1. #GlobalAzure Plataforma de compiladores .NET, C# 6 e Visual Studio 2015 Rogério Moraes de Carvalho rogeriomc.wordpress.com @rogeriomc
  2. 2. Patrocinadores
  3. 3. Rogério Moraes de Carvalho Consultor e Instrutor de TI Trabalha com a plataforma .NET desde o Visual Studio .NET beta 1 em 2001 Instrutor em cursos oficiais da Microsoft desde .NET 1.0 Sobre o palestrante
  4. 4. Plataforma de compiladores .NET & Visual Studio 2015 Plataforma de compiladores .NET (“Roslyn”) Evolução do projeto “Roslyn” Linha de produtos Visual Studio 2015 Visual Studio 2015 CTP 6 Experiências mais ricas no Visual Studio 2015 Agenda
  5. 5. 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 propriedades automáticas somente com get no construtor using estático await em blocos catch e finally Filtros de exceção Agenda
  6. 6. Linguagem de programação C# 6 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 Agenda
  7. 7. Plataforma de compiladores .NET (“Roslyn”) 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 GitHub https://github.com/dotnet/roslyn Plataforma de compiladores .NET
  8. 8. 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 Visual Studio "14" CTP 1 03 jun 2014 Visual Studio "14" CTP 2, CTP 3, CTP 4... Visual Studio 2015 CTP 5 16 jan 2015 Visual Studio 2015 CTP 6 23 fev 2015 No Keynote do dia 2 do Build 2014, o código-fonte do “Roslyn” foi aberto: roslyn.codeplex.com 03 abr 2014
  9. 9. Linha de produtos Visual Studio 2015 Visual Studio Community 2013 Visual Studio Professional 2013 with MSDN Visual Studio Premium 2013 with MSDN Visual Studio Ultimate 2013 with MSDN Visual Studio Community 2015 Visual Studio Professional 2015 with MSDN Visual Studio Enterprise 2015 with MSDN Visual Studio Professional 2015, Team Foundation Server 2015 Team Foundation Server Express 2015, Visual Studio Express 2015 Versão final – Quando? jun/2015 a ago/2015
  10. 10. Ferramentas de depuração de IU para XAML Single Sign-In CodeLens Code Maps Ferramentas de diagnóstico Configurações de exceção Editor de JavaScript Visual Studio 2015 CTP 6 Testes Unitários Emulador do Visual Studio para Android Ferramentas para Apache Cordova C++ para desenvolvimento móvel cross-platform ASP.NET Visual C++
  11. 11. Integração com a plataforma de compiladores .NET (“Roslyn”) Experiência melhorada em: IntelliSense “Refatoração” CodeLens Depuração Experiências mais ricas no Visual Studio 2015 Avanços em “refatoração” Melhorias em “refatorações” existentes Renomeação Extração de métodos Duas novas refatorações Introdução de variável local Variável inline temporária
  12. 12. Classes e estruturas com parâmetros definem construtores primários Construtores primários simplificam a codificação Construtores primários Parâmetros em classes e estruturas 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
  13. 13. Muitos construtores inicializam campos e propriedades automáticas Pode haver a necessidade de fazer outras coisas, como validar argumentos Construtores primários Corpos de construtores primários 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
  14. 14. Tipos com construtores primários podem definir outros construtores Os outros construtores devem chamar o primário, de forma direta ou indireta Construtores primários Construtores explícitos 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
  15. 15. 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 Avanços em propriedades automáticas Iniciadores em propriedades automáticas 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
  16. 16. Nova possibilidade de propriedade automática somente com get Neste caso, o campo de apoio é declarado como readonly Avanços em propriedades automáticas Propriedades automáticas somente com get 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
  17. 17. Propriedades automáticas somente com get podem ser iniciadas em construtores Atribuição de propriedades automáticas somente com get em construtor 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; } }
  18. 18. 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 estático 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; ... } }
  19. 19. 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 await em blocos catch e finally 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(); }
  20. 20. 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# Filtros de exceção 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); }
  21. 21. Operador nulo-condicional ? Permite acessar membros e elementos quando o receptor não for nulo Caso contrário, retorna nulo Operadores nulos-condicionais 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
  22. 22. 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 Expressões nameof 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; }
  23. 23. Permite declarar variáveis locais no meio de uma expressão A declaração pode estar com ou sem um iniciador Expressões de declaração 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
  24. 24. Declaração de membros de função com expressões lambda Mesma conveniência de expressões lambda com delegates Expressões de corpo em membros de função Métodos e similares ou propriedades somente com get e similares 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); }
  25. 25. Nova sintaxe de iniciadores de dicionários e objetos com indexadores Notação mais elegante, com o índice entre colchetes Iniciadores de índice 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" };
  26. 26. 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 Literais binários e separadores de dígitos [Flags] public enum TitulosPalestrante { MostValuableProfessional = 1, MicrosoftCertifiedSolutionDeveloper = 2, MicrosoftCertifiedTrainer = 4, MvpMcsdMct = 7 } [Flags] public enum TitulosPalestrante { MostValuableProfessional = 0b000_001, MicrosoftCertifiedSolutionDeveloper = 0b000_010, MicrosoftCertifiedTrainer = 0b000_100, MvpMcsdMct = 0b000_111 }
  27. 27. Açúcar sintático para uma chamada do String.Format Interpolação de strings 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}";
  28. 28. Plataforma de compiladores .NET open source no GitHub https://github.com/dotnet/roslyn Visual Studio 2015 CTP 6 para download https://www.visualstudio.com/downloads/visual-studio-2015-ctp-vs Microsoft Virtual Academy http://www.microsoftvirtualacademy.com Build 2015 – San Francisco, CA (29 de abril a 01 de maio) http://www.buildwindows.com Recursos adicionais
  29. 29. THE BIGGEST MICROSOFT AZURE COMMUNITY EVENT 192 LOCATIONS 57 COUNTRIES +10000 PEOPLE

×