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.
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. 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. 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. 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.
8. 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
9. 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
10. 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
11. 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++
12. 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
13.
14. 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
15. 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
16. 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
17. 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
18. 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
19. 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; }
}
20. 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;
...
}
}
21. 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();
}
22. 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);
}
23. 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
24. 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;
}
25. 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
26. 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);
}
27. 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"
};
28. 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
}
29. 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}";
30. 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