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

28
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14” Rogério Moraes de Carvalho VITA Informática rogeriom.wordpress.com | @ rogeriomc

description

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.

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

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

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

Rogério Moraes de CarvalhoVITA Informática

rogeriom.wordpress.com | @rogeriomc

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

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”

Page 3: Plataforma de compiladores .NET (“Roslyn”), C# 6 e 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

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

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

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

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

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

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

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

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

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

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

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

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; }

}

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

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;...

}}

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

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();

}

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

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);}

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

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

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

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;

}

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

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

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

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);

}

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

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"

};

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

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

}

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

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}";

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

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)

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

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