Plataforma de compiladores .NET,
Visual Studio 2015, C# 6 e futuro C# 7
Rogério Moraes de Carvalho
Consultor e instrutor de TI
rogeriom.wordpress.com | @rogeriomc
Agenda
Plataforma de compiladores .NET & Visual Studio 2015
Plataforma de compiladores .NET (“Roslyn”)
Evolução do projeto “Roslyn”
Linha de produtos comerciais do Visual Studio 2015
Linha de produtos gratuitos do Visual Studio 2015
Visual Studio Online e Visual Studio Code
Visual Studio 2015 RTM
Agenda
Novidades da linguagem de programação C# 6
Construtores primários (C# 7)
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
Operadores nulos-condicionais
Expressões nameof
Agenda
Novidades da linguagem de programação C# 6
Expressões de declaração (C# 7)
Expressões de corpo em membros de função
Iniciadores de índice
Literais binários e separadores de dígitos (C# 7)
Interpolação de strings
Ferramentas e documentação
Recursos adicionais
Plataforma de compiladores .NET &
Visual Studio 2015
Plataforma de compiladores .NET (“Roslyn”)
Plataforma de compiladores .NET & Visual Studio 2015
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
Evolução do projeto “Roslyn”
Plataforma de compiladores .NET & Visual Studio 2015
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
No Keynote do dia 2 do Build 2014, o
código-fonte do “Roslyn” foi aberto:
roslyn.codeplex.com
03
abr
2014
Visual Studio "14" CTP 1
(posteriormente: CTP 2, CTP 3, CTP 4)
03
jun
2014
Visual Studio 2015 CTP 5
(posteriormente: CTP 6)
16
jan
2015
Visual Studio 2015 RC
29
abr
2015
Visual Studio 2015 RTM
20
jul
2015
Linha de produtos comerciais do Visual Studio 2015
Plataforma de compiladores .NET & Visual Studio 2015
Visual Studio Professional 2013 with MSDN
Visual Studio Premium 2013 with MSDN
Visual Studio Ultimate 2013 with MSDN
Visual Studio Professional 2015 with MSDN
Visual Studio Enterprise 2015 with MSDN
Visual Studio Test Professional 2013 Visual Studio Test Professional 2015
Visual Studio Team Foundation Server 2013 Visual Studio Team Foundation Server 2015 RC 2
Linha de produtos gratuitos do Visual Studio 2015
Plataforma de compiladores .NET & Visual Studio 2015
Visual Studio Community 2013
Visual Studio Express for Desktop 2013
Visual Studio Community 2015
Visual Studio Express for Desktop 2015
Visual Studio Express for Web 2013 Visual Studio Express for Web 2015
Visual Studio Express for Windows 2015Novo
Em
breve
Visual Studio Team Foundation Server Express
2013
Visual Studio Team Foundation Server Express
2015
Visual Studio Online e Visual Studio Code
Plataforma de compiladores .NET & Visual Studio 2015
Visual Studio Online (www.visualstudio.com)
Conjunto de serviços na nuvem para times de desenvolvimento de software
Para qualquer linguagem e tudo em um pacote único
Java, Python, HTML5, JavaScript, C#, ...
Complemento para ambientes integrados de desenvolvimento
Visual Studio, Eclipse, Xcode, ...
Grátis para times de 5 usuários, com repositórios privados ilimitados
Visual Studio Code (code.visualstudio.com)
Editor gratuito da Microsoft para desenvolvimento de aplicações para web/nuvem
Disponível para Linux, Mac OS X e Windows (atualmente na versão 0.5.0)
Visual Studio 2015 RTM
Plataforma de compiladores .NET & Visual Studio 2015
Linguagens de programação
C#
Visual Basic
Visual C++
F#
JavaScript
TypeScript
Desenvolvimento para Windows 10
Visual Studio Tools for Universal
Windows App Development
Desenvolvimento móvel
Visual C++ for Cross-Platform Mobile
Development
Visual Studio Tools for Apache Cordova
Visual Studio Emulator for Android
Xamarin (terceiros: Xamarin Inc.)
Frameworks
.NET Framework 4.6
Entity Framework
ASP.NET
Visual Studio 2015 RTM
Plataforma de compiladores .NET & Visual Studio 2015
Codificação com qualidade
Visual Studio IDE
Depuração e diagnósticos
IntelliTest
Application Insights
Release Management
Git Version Control
CodeLens
Arquitetura, projeto e modelagem
Produtividade em interfaces XAML
Blend
XAML Language Service
Gerenciamento de pacotes
NuGet
Correções de bugs
Diversos outros recursos
Visual Studio 2015 RTM
Plataforma de compiladores .NET & Visual Studio 2015
Extensões
Azure SDK 2.7 for .NET
Python Tools for Visual Studio 2.2 (RTM)
Visual Studio Tools for Unity 2.0 (RTM)
Node.js Tools for Visual Studio 1.1 (RC)
Office Developer Tools for Visual Studio 2015
GitHub Extension for Visual Studio 2015 (RTM)
Cloud-based Load Testing
Novidades da linguagem de programação C# 6
e o futuro C# 7
Construtores primários (C# 7)
Novidades da linguagem de programação C# 6 e o futuro C# 7
Parâmetros em classes e estruturas
Classes e estruturas com parâmetros definem construtores primários
Construtores 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
Construtores primários (C# 7)
Novidades da linguagem de programação C# 6 e o futuro C# 7
Corpos de construtores primários
Muitos construtores inicializam campos e propriedades automáticas
Pode 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
Construtores primários (C# 7)
Novidades da linguagem de programação C# 6 e o futuro C# 7
Construtores explícitos
Tipos com construtores primários podem definir outros construtores
Os 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
Avanços em propriedades automáticas
Novidades da linguagem de programação C# 6 e o futuro C# 7
Iniciadores em propriedades automáticas
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
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áticas
Novidades da linguagem de programação C# 6 e o futuro C# 7
Propriedades automáticas somente com get
Nova possibilidade de propriedade automática somente com get
Neste 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
Avanços em propriedades automáticas
Novidades da linguagem de programação C# 6 e o futuro C# 7
Propriedades automáticas podem ser iniciadas em construtores
Sejam as propriedades automáticas somente com get ou com get e set
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; }
}
using estático
Novidades da linguagem de programação C# 6 e o futuro C# 7
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 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
Novidades da linguagem de programação C# 6 e o futuro C# 7
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
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
Novidades da linguagem de programação C# 6 e o futuro C# 7
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#
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 nulo-condicionais
Novidades da linguagem de programação C# 6 e o futuro C# 7
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 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
Expressões nameof
Novidades da linguagem de programação C# 6 e o futuro C# 7
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
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 corpo em membros de função
Novidades da linguagem de programação C# 6 e o futuro C# 7
Declaração de membros de função com expressões lambda
Mesma 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);
}
Expressões de declaração (C# 7)
Novidades da linguagem de programação C# 6 e o futuro C# 7
Permite declarar variáveis locais no meio de uma expressão
A declaração pode estar com ou sem um iniciador
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
Iniciadores de índice
Novidades da linguagem de programação C# 6 e o futuro C# 7
Nova sintaxe de iniciadores de dicionários e objetos com indexadores
Notaçã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 (C# 7)
Novidades da linguagem de programação C# 6 e o futuro C# 7
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
[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
}
C# 7
Interpolação de strings
Novidades da linguagem de programação C# 6 e o futuro C# 7
Açúcar sintático para uma chamada do método estático String.Format
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}";
Recursos adicionais
Ferramentas e documentação
Microsoft Virtual Academy
www.microsoftvirtualacademy.com
MSDN Channel 9
channel9.msdn.com
MSDN Library
msdn.microsoft.com/library
C# 6 Language Specification
Ainda não está disponível
Visual Studio 2015/Online/Code
www.visualstudio.com
.NET Compiler Platform ("Roslyn")
github.com/dotnet/roslyn
.NET Foundation
www.dotnetfoundation.org
GitHub – ASP.NET 5 Home
github.com/aspnet/home
The ASP.NET Site
www.asp.net

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

  • 1.
    Plataforma de compiladores.NET, Visual Studio 2015, C# 6 e futuro C# 7 Rogério Moraes de Carvalho Consultor e instrutor de TI rogeriom.wordpress.com | @rogeriomc
  • 2.
    Agenda Plataforma de compiladores.NET & Visual Studio 2015 Plataforma de compiladores .NET (“Roslyn”) Evolução do projeto “Roslyn” Linha de produtos comerciais do Visual Studio 2015 Linha de produtos gratuitos do Visual Studio 2015 Visual Studio Online e Visual Studio Code Visual Studio 2015 RTM
  • 3.
    Agenda Novidades da linguagemde programação C# 6 Construtores primários (C# 7) 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 Operadores nulos-condicionais Expressões nameof
  • 4.
    Agenda Novidades da linguagemde programação C# 6 Expressões de declaração (C# 7) Expressões de corpo em membros de função Iniciadores de índice Literais binários e separadores de dígitos (C# 7) Interpolação de strings Ferramentas e documentação Recursos adicionais
  • 5.
    Plataforma de compiladores.NET & Visual Studio 2015
  • 6.
    Plataforma de compiladores.NET (“Roslyn”) Plataforma de compiladores .NET & Visual Studio 2015 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
  • 7.
    Evolução do projeto“Roslyn” Plataforma de compiladores .NET & Visual Studio 2015 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 No Keynote do dia 2 do Build 2014, o código-fonte do “Roslyn” foi aberto: roslyn.codeplex.com 03 abr 2014 Visual Studio "14" CTP 1 (posteriormente: CTP 2, CTP 3, CTP 4) 03 jun 2014 Visual Studio 2015 CTP 5 (posteriormente: CTP 6) 16 jan 2015 Visual Studio 2015 RC 29 abr 2015 Visual Studio 2015 RTM 20 jul 2015
  • 8.
    Linha de produtoscomerciais do Visual Studio 2015 Plataforma de compiladores .NET & Visual Studio 2015 Visual Studio Professional 2013 with MSDN Visual Studio Premium 2013 with MSDN Visual Studio Ultimate 2013 with MSDN Visual Studio Professional 2015 with MSDN Visual Studio Enterprise 2015 with MSDN Visual Studio Test Professional 2013 Visual Studio Test Professional 2015 Visual Studio Team Foundation Server 2013 Visual Studio Team Foundation Server 2015 RC 2
  • 9.
    Linha de produtosgratuitos do Visual Studio 2015 Plataforma de compiladores .NET & Visual Studio 2015 Visual Studio Community 2013 Visual Studio Express for Desktop 2013 Visual Studio Community 2015 Visual Studio Express for Desktop 2015 Visual Studio Express for Web 2013 Visual Studio Express for Web 2015 Visual Studio Express for Windows 2015Novo Em breve Visual Studio Team Foundation Server Express 2013 Visual Studio Team Foundation Server Express 2015
  • 10.
    Visual Studio Onlinee Visual Studio Code Plataforma de compiladores .NET & Visual Studio 2015 Visual Studio Online (www.visualstudio.com) Conjunto de serviços na nuvem para times de desenvolvimento de software Para qualquer linguagem e tudo em um pacote único Java, Python, HTML5, JavaScript, C#, ... Complemento para ambientes integrados de desenvolvimento Visual Studio, Eclipse, Xcode, ... Grátis para times de 5 usuários, com repositórios privados ilimitados Visual Studio Code (code.visualstudio.com) Editor gratuito da Microsoft para desenvolvimento de aplicações para web/nuvem Disponível para Linux, Mac OS X e Windows (atualmente na versão 0.5.0)
  • 11.
    Visual Studio 2015RTM Plataforma de compiladores .NET & Visual Studio 2015 Linguagens de programação C# Visual Basic Visual C++ F# JavaScript TypeScript Desenvolvimento para Windows 10 Visual Studio Tools for Universal Windows App Development Desenvolvimento móvel Visual C++ for Cross-Platform Mobile Development Visual Studio Tools for Apache Cordova Visual Studio Emulator for Android Xamarin (terceiros: Xamarin Inc.) Frameworks .NET Framework 4.6 Entity Framework ASP.NET
  • 12.
    Visual Studio 2015RTM Plataforma de compiladores .NET & Visual Studio 2015 Codificação com qualidade Visual Studio IDE Depuração e diagnósticos IntelliTest Application Insights Release Management Git Version Control CodeLens Arquitetura, projeto e modelagem Produtividade em interfaces XAML Blend XAML Language Service Gerenciamento de pacotes NuGet Correções de bugs Diversos outros recursos
  • 13.
    Visual Studio 2015RTM Plataforma de compiladores .NET & Visual Studio 2015 Extensões Azure SDK 2.7 for .NET Python Tools for Visual Studio 2.2 (RTM) Visual Studio Tools for Unity 2.0 (RTM) Node.js Tools for Visual Studio 1.1 (RC) Office Developer Tools for Visual Studio 2015 GitHub Extension for Visual Studio 2015 (RTM) Cloud-based Load Testing
  • 14.
    Novidades da linguagemde programação C# 6 e o futuro C# 7
  • 15.
    Construtores primários (C#7) Novidades da linguagem de programação C# 6 e o futuro C# 7 Parâmetros em classes e estruturas Classes e estruturas com parâmetros definem construtores primários Construtores 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
  • 16.
    Construtores primários (C#7) Novidades da linguagem de programação C# 6 e o futuro C# 7 Corpos de construtores primários Muitos construtores inicializam campos e propriedades automáticas Pode 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
  • 17.
    Construtores primários (C#7) Novidades da linguagem de programação C# 6 e o futuro C# 7 Construtores explícitos Tipos com construtores primários podem definir outros construtores Os 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
  • 18.
    Avanços em propriedadesautomáticas Novidades da linguagem de programação C# 6 e o futuro C# 7 Iniciadores em propriedades automáticas 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 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
  • 19.
    Avanços em propriedadesautomáticas Novidades da linguagem de programação C# 6 e o futuro C# 7 Propriedades automáticas somente com get Nova possibilidade de propriedade automática somente com get Neste 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
  • 20.
    Avanços em propriedadesautomáticas Novidades da linguagem de programação C# 6 e o futuro C# 7 Propriedades automáticas podem ser iniciadas em construtores Sejam as propriedades automáticas somente com get ou com get e set 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; } }
  • 21.
    using estático Novidades dalinguagem de programação C# 6 e o futuro C# 7 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 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; ... } }
  • 22.
    await em blocoscatch e finally Novidades da linguagem de programação C# 6 e o futuro C# 7 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 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(); }
  • 23.
    Filtros de exceção Novidadesda linguagem de programação C# 6 e o futuro C# 7 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# 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); }
  • 24.
    Operadores nulo-condicionais Novidades dalinguagem de programação C# 6 e o futuro C# 7 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 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
  • 25.
    Expressões nameof Novidades dalinguagem de programação C# 6 e o futuro C# 7 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 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; }
  • 26.
    Expressões de corpoem membros de função Novidades da linguagem de programação C# 6 e o futuro C# 7 Declaração de membros de função com expressões lambda Mesma 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); }
  • 27.
    Expressões de declaração(C# 7) Novidades da linguagem de programação C# 6 e o futuro C# 7 Permite declarar variáveis locais no meio de uma expressão A declaração pode estar com ou sem um iniciador 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
  • 28.
    Iniciadores de índice Novidadesda linguagem de programação C# 6 e o futuro C# 7 Nova sintaxe de iniciadores de dicionários e objetos com indexadores Notaçã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" };
  • 29.
    Literais binários eseparadores de dígitos (C# 7) Novidades da linguagem de programação C# 6 e o futuro C# 7 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 [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 } C# 7
  • 30.
    Interpolação de strings Novidadesda linguagem de programação C# 6 e o futuro C# 7 Açúcar sintático para uma chamada do método estático String.Format 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}";
  • 31.
    Recursos adicionais Ferramentas edocumentação Microsoft Virtual Academy www.microsoftvirtualacademy.com MSDN Channel 9 channel9.msdn.com MSDN Library msdn.microsoft.com/library C# 6 Language Specification Ainda não está disponível Visual Studio 2015/Online/Code www.visualstudio.com .NET Compiler Platform ("Roslyn") github.com/dotnet/roslyn .NET Foundation www.dotnetfoundation.org GitHub – ASP.NET 5 Home github.com/aspnet/home The ASP.NET Site www.asp.net