Post on 24-May-2015
description
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Rogério Moraes de CarvalhoVITA Informática
rogeriom.wordpress.com | @rogeriomc
AgendaPlataforma 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”
AgendaLinguagem 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
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
Evolução do projeto “Roslyn”
Início do projeto “Roslyn”, internamente
na Microsoftjun
2009
Liberação do primeiro “Roslyn”
Community Technology Preview (CTP)
19out
2011
“Roslyn” June 2012 CTP
(suporte ao VS 2010 SP1 e ao VS 2012 RC)
05jun
2012
“Roslyn” September 2012 CTP
(suporte somente ao VS 2012 RTM)
17set
2012
No Keynote do dia 2 do Build 2014, o
código-fonte do “Roslyn” foi aberto:
roslyn.codeplex.com
03abr
2014
Visual Studio "14" CTP 1
(version 14.0.21730.1.DP)
03jun
2014
Visual Studio "14" CTP 2
(version 14.0.21901.1.DP)
08jul
2014
Visual Studio "14" CTP 3
(version 14.0.22013.1.DP)
18ago2014
Visual Studio "14" CTP 4
(version 14.0.22129.1.DP)
06out
2014
ASP.NET vNext
O ASP.NET vNext é a próxima versão do ASP.NETReconstruído do zero para criar uma pilha .NET leve e compositiva
Unificação das APIs MVC, Web API e Web PagesUm único framework, denominado MVC 6, independente do System.Web.dll
Compilação dinâmica, cross-platform e open sourceUsa o compilador “Roslyn” e executa em Mac OS X e Linux (projeto Mono)
Agnóstico da plataforma de desenvolvimento e da hospedagemNão depende do Visual Studio (desenvolvimento) e nem do IIS (hospedagem)
Pode usar um subconjunto do .NET Framework otimizado para a nuvem
ASP.NET & ASP.NET vNext
Websites Serviços
ASP.NET
ASP.N
ET vN
ext
Web Forms Signal R
ASP.NET MVC 6
Web Pages MVC Web API
Núcleo unificado
Visual Studio “14” CTP 4
ASP.NET vNext no Visual Studio “14” CTP 4Inclui 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 vNextConté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 NativeCorreções no suporte parcial ao WCF
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
Estágio final de renovação da linguagem C# 6
Mudanças no conjunto de características da linguagemMads 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ãoFoco principal na primeira versão da plataforma de compiladores .NET (“Roslyn”)
Características que estão sendo cortadas da linguagem C# 6Construtores primários
Expressões de declaração
Há muito trabalho e esforço na implementação dos recursos cortadosProrrogados para uma próxima versão da linguagem C# (provavelmente: C# 7)
Construtores primáriosParâmetros em classes e estruturas
Classes e estruturas com parâmetros definem construtores primáriosConstrutores 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
Construtores primáriosCorpos de construtores primários
Muitos construtores inicializam campos e propriedades automáticasPode 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
Construtores primáriosConstrutores explícitos
Tipos com construtores primários podem definir outros construtoresOs 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
Avanços em propriedades automáticasIniciadores em propriedades automáticas
Inicia o campo de apoio, ao invés de acessar o membro de função setSimilar 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
Avanços em propriedades automáticasPropriedades automáticas somente com get
Nova possibilidade de propriedade automática somente com getNeste 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
Atribuição de autoprops somente com get em construtor
Propriedades automáticas somente com get podem ser iniciadas em construtorespublic 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; }
}
using estático
Permite especificar uma classe estática numa cláusula usingOs 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;...
}}
await em blocos catch e finally
Em C# 5 não é possível usar await em blocos catch e finallyLimitaçã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();
}
Filtros de exceção
Se o filtro for verdadeiro, então a captura é processadaCaso 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);}
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 nullint totalTrilhas = trilhas?.Length ?? 0; // 0 se trilhas for null (combinado com o operador coalescente nulo)Trilha primeiraTrilha = trilhas?[0]; // null se trilhas for nullint? totalPalestrasPrimeiraTrilha = trilhas?[0].Palestras?.Count(); // encadeamento de operadores nulo-condicionais
Expressões nameof
Retorna uma string com o nome de algum elemento do programaEventualmente é 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;
}
Expressões de declaração
Permite declarar variáveis locais no meio de uma expressãoA 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
Expressões de corpo em membros de funçãoMétodos e similares ou propriedades somente com get e similares
Declaração de membros de função com expressões lambdaMesma 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);
}
Iniciadores de índice
Nova sintaxe de iniciadores de dicionários e objetos com indexadoresNotaçã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"
};
Literais binários e separadores de dígitos
Literais binários pelo acréscimo do prefixo 0bMuito ú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
}
Interpolação de strings
Açúcar sintático para uma chamada do String.Formatstring 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}";
Demo:
Projeto ASP.NET vNext no Visual Studio “14” CTP 4
Criação de uma solução Tdc composta por 2 projetosTdc.Web – ASP.NET vNext Empty Web Application
Aplicação Web ASP.NET MVC para divulgar palestras do TDC
Tdc.Dados – ASP.NET vNext Class LibraryBiblioteca de classes para acesso aos dados
Modelo: entidades de dados
Repositório: recuperação dos dados (armazenados em formato JSON)
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.comVisual Studio “14” CTPs
www.visualstudio.com/en-us/downloads/visual-studio-14-ctp-vs
(Visual Studio “14” CTP 4 em 06/10/2014)
Channel 9TechEd 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 2014Conferência online gratuita
www.dotnetconf.net
videos.dotnetconf.net