plataforma de compiladores .net, c# 6 e visual studio 2015

32
#GlobalAzure Plataforma de compiladores .NET, C# 6 e Visual Studio 2015 Rogério Moraes de Carvalho rogeriomc.wordpress.com @ rogeriomc

Upload: rogerio-moraes-de-carvalho

Post on 17-Jul-2015

358 views

Category:

Technology


5 download

TRANSCRIPT

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

#GlobalAzure

Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Rogério Moraes de Carvalho

rogeriomc.wordpress.com

@rogeriomc

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

Patrocinadores

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

Rogério Moraes de CarvalhoConsultor 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

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

Plataforma de compiladores .NET & Visual Studio 2015Plataforma 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

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

Linguagem de programação C# 6Está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

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

Linguagem de programação C# 6Operadores 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

Page 7: Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Page 8: Plataforma de compiladores .NET, C# 6 e Visual Studio 2015

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

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

Evolução do projeto “Roslyn”

Início do projeto “Roslyn”, internamente

na Microsoftjun

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)

05jun

2012

“Roslyn” September 2012 CTP

(suporte somente ao VS 2012 RTM)

17set

2012

Visual Studio "14" CTP 103jun

2014

Visual Studio "14" CTP 2, CTP 3, CTP 4...

Visual Studio 2015 CTP 516jan

2015

Visual Studio 2015 CTP 623fev

2015

No Keynote do dia 2 do Build 2014, ocódigo-fonte do “Roslyn” foi aberto: roslyn.codeplex.com

03abr

2014

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

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

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

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++

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

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çõesIntrodução de variável local

Variável inline temporária

Page 13: Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Page 14: Plataforma de compiladores .NET, C# 6 e Visual Studio 2015

Classes e estruturas com parâmetros definem construtores primáriosConstrutores primários simplificam a codificação

Construtores primáriosParâ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

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

Muitos construtores inicializam campos e propriedades automáticasPode haver a necessidade de fazer outras coisas, como validar argumentos

Construtores primáriosCorpos 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

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

Tipos com construtores primários podem definir outros construtoresOs outros construtores devem chamar o primário, de forma direta ou indireta

Construtores primáriosConstrutores 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

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

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

Avanços em propriedades automáticasIniciadores 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

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

Nova possibilidade de propriedade automática somente com getNeste caso, o campo de apoio é declarado como readonly

Avanços em propriedades automáticasPropriedades 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

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

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

}

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

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

}}

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

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

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

}

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

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#

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

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

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 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 24: Plataforma de compiladores .NET, C# 6 e Visual Studio 2015

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

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;

}

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

Permite declarar variáveis locais no meio de uma expressãoA 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

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

Declaração de membros de função com expressões lambdaMesma conveniência de expressões lambda com delegates

Expressões de corpo em membros de funçãoMé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);

}

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

Nova sintaxe de iniciadores de dicionários e objetos com indexadoresNotaçã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"

};

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

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

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

}

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

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

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

Plataforma de compiladores .NET open source no GitHubhttps://github.com/dotnet/roslyn

Visual Studio 2015 CTP 6 para downloadhttps://www.visualstudio.com/downloads/visual-studio-2015-ctp-vs

Microsoft Virtual Academyhttp://www.microsoftvirtualacademy.com

Build 2015 – San Francisco, CA (29 de abril a 01 de maio)http://www.buildwindows.com

Recursos adicionais

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

THE BIGGEST

MICROSOFT AZURE

COMMUNITY EVENT192 LOCATIONS

57 COUNTRIES

+10000 PEOPLE

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