C# está em constante evolução para melhor atender às necessidades dos desenvolvedores. As principais atualizações incluem: suporte a generics, LINQ, programação assíncrona, tipos dinâmicos e interoperabilidade melhorada. O projeto Roslyn da Microsoft visa tornar os compiladores C# e VB abertos através de APIs, permitindo novas funcionalidades como refatoração de código e meta-programação.
TechEd Brasil 2011 Review - Evolução da linguagem de programação C#
1.
2. Evolução da linguagem
de programação C#
Rogério Moraes de Carvalho
VITA Informática
@rogeriomc
rogeriomc.wordpress.com
3. A evolução da linguagem C#
Evolução C# 6? Projeto Roslyn
(?)
C# 5 Windows Runtime,
(2012) programação assíncrona, ...
Objetos tipados dinamicamente,
C# 4 parâmetros opcionais e nomeados,
(Mar 2010)
covariância e contravariância, …
Language Integrated Query (LINQ),
C# 3.0 expressões Lambda, métodos de
(Nov 2007)
extensão, tipos anônimos, ...
Generics, Iterators, tipos parciais,
C# 2.0 tipos anuláveis, classes estáticas,
(Nov 2005)
métodos anônimos, ...
Código gerenciado, linguagem POO,
C# 1.0 suporte nativo a propriedades e
(Fev 2002)
eventos, exceções, delegates, ...
4. Sistema de tipos
Linguagem C# 1.0
Suporte a duas categorias de tipos
Tipos por valor
Estruturas (incluindo os tipos simples)
Enumerações
Tipos por referência
Arrays
Classes
Interfaces
Delegates
Sistema unificado de tipos
object é base de todos tipos
Boxing e Unboxing
5. Memória e instruções
Linguagem C# 1.0
Gerenciamento automático de
memória
Coletor de lixo (Garbage Collector)
Instruções inspiradas em C/C++ e
Java
Blocos, rótulos, variáveis e expressões
Laços: while, do...while, for e foreach
Exceções: try...catch...finally, throw
Condicionais: if e switch
checked e unchecked
using
6. Herança e membros de classe
Linguagem C# 1.0
Suporte a herança simples
Membros possíveis em classes
Constantes
Campos
Métodos
Propriedades
Eventos
Operadores
Indexadores
Construtores
Destrutores
7. Atributos e outros recursos
Linguagem C# 1.0
Atributos
Elementos que permitem fazer
anotações de forma declarativa
Namespaces e assemblies
Versionamento
Resolve o problema conhecido como
DLL Hell do modelo COM
8. Generics e Iterators
Principais novidades da linguagem C# 2.0
Generics
Os tipos genéricos permitem um alto
nível de reutilização de código
Permite a definição de tipos
parametrizáveis
Desempenho melhorado em classes de
coleções
Iterators
Torna simples a definição de como
um laço foreach vai interagir com o
conteúdo de uma coleção
9. Tipos parciais e anuláveis
Principais novidades da linguagem C# 2.0
Tipos parciais
As definições de classes, estruturas ou
interfaces podem ser divididas em
múltiplos arquivos
O Visual Studio utiliza esta característica
para separar o código gerado do código do
usuário
Tipos anuláveis
Permite a uma variável de tipo por
valor ter um valor indefinido
Úteis ao se trabalhar com bancos
de dados ou outras estruturas
10. Métodos anônimos e ::
Principais novidades da linguagem C# 2.0
Métodos anônimos
Tornam possível a passagem de um
bloco de código como um parâmetro
Em qualquer lugar em que um delegate é
esperado
Qualificador de apelidos de
namespace
O novo operador (::) fornece maior
controle no acesso de membros
de um namespace
Habilidade de acessar um
membro no namespace global
11. Classes estáticas e mais
Principais novidades da linguagem C# 2.0
Classes estáticas
Modo seguro e conveniente de declarar
uma classe que contém somente
membros estáticos e não deve ser
instanciada
Antes era necessário definir construtores
de instância privados para não permitir que
a mesma fosse instanciada
Permite definir diferentes níveis de
acesso nos métodos de leitura e
escrita de uma propriedade
12. Principais inovações Expressões de
Principais novidades da linguagem C# 3.0 consulta
var mulheres =
from c in contatos
where c.Sexo == Sexo.Feminino
select new { c.Nome, c.Email }; Árvores de
expressão
Tipos implícitos
em variáveis Expressões
locais lambda Propriedades
var mulheres = automáticas
contatos
.Where(c => c.Sexo == Sexo.Feminino) Métodos
.Select(c => new {c.Nome, c.Email}); parciais
Métodos de Tipos Iniciadores de
extensão objetos Iniciadores de
anônimos
coleções
13. LINQ
Principais novidades da linguagem C# 3.0
C# 3.0 VB 9.0 Outras linguagens…
.NET LINQ (Language INtegrated Query)
LINQ to LINQ to LINQ to LINQ to LINQ to
Objects DataSets SQL Entities XML
<agenda>
<contato>
<nome>. . . </nome>
<email> . . . </email>
<fone/> . . . </fone>
<contato/>
...
</agenda>
Objetos Bancos de dados
relacionais XML
14. Parâmetros opcionais e
nomeados
Principais novidades da linguagem C# 4
public StreamReader OpenTextFile(
string path, Método primário
Encoding encoding,
bool detectEncoding,
int bufferSize);
public StreamReader OpenTextFile(
string path,
Encoding encoding, Sobrecargas
bool detectEncoding); secundárias
public StreamReader OpenTextFile(
string path, Chamadas ao método
Encoding encoding); primário com valores
padrão
public StreamReader OpenTextFile(
string path);
15. Parâmetros opcionais e
nomeados
Principais novidades da linguagem C# 4
public StreamReader OpenTextFile(
string path, Parâmetros opcionais
Encoding encoding,= null,
encoding
bool detectEncoding,= true,
detectEncoding
int bufferSize); 1024);
bufferSize = Argumentos
nomeados
OpenTextFile("foo.txt", Encoding.UTF8);
OpenTextFile("foo.txt", Encoding.UTF8, bufferSize: 4096);
Argumentos
Argumentos Argumentos
nomeados podem
avaliados na ordem nomeados precisam
aparecer em
da escrita ser os últimos
qualquer ordem
Argumentos não
OpenTextFile(
opcionais devem ser
bufferSize: 4096,
path: "foo.txt", especificados
detectEncoding: false);
17. Objetos com tipagem dinâmica
Principais novidades da linguagem C# 4
Calculadora calc = ObterCalculadora();
object calc = ObterCalculadora(); int soma = calc.Adicionar(10, 20);
Type tipoCalc = calc.GetType();
object res =
tipoCalc.InvokeMember("Adicionar",
BindingFlags.InvokeMethod, null,
new object[] { 10, 20 });
ScriptObject calc = ObterCalculadora();
int soma = Convert.ToInt32(res); res = calc.Invoke("Adicionar", 10, 20);
object
int soma = Convert.ToInt32(res);
Tipado estaticamente dynamic calc = ObterCalculadora();
para ser dinâmico int sum = calc.Add(10, 20);
Coversão Invocação dinâmica
dinâmica do método
18. Covariância e contravariância
Principais novidades da linguagem C# 4
out = covariância
public interface IEnumerable<T> T>
IEnumerable<out
somente posições de
{
IEnumerator<T> GetEnumerator();
saída
}
Pode ser tratada como
menos específica
public interface IEnumerator<T> T>
IEnumerator<out
{
T Current { get; } IEnumerable<string> strings = ObterStrings();
bool MoveNext(); IEnumerable<object> objects = strings;
}
in = contravariância
somente posições de
public interface IComparer<T> T>
IComparer<in entrada
{
int Compare(T x, T y); Pode ser tratada como
} mais específica
IComparer<object> objComp = ObterComparer();
IComparer<string> strComp = objComp;
19. TAP
Principais novidades da linguagem C# 5
Task-based Asynchronous Pattern
Novo padrão de programação
assíncrona no .NET Framework
Baseado nos tipos Task e Task<TResult>
do namespace System.Threading.Tasks
Implementado por um único método
NomeOperacaoAsync
Deve retornar Task ou Task<TResult>, baseado
no tipo de retorno void ou TResult,
respectivamente, do método síncrono
correspondente (NomeOperacao)
Se a classe já tiver um método
NomeOperacaoAsync, então deve-se
usar NomeOperacaoTaskAsync
20. Versão assíncrona via TAP
Principais novidades da linguagem C# 5
Versão síncrona de uma operação
TRetorno NomeOperacao(TParam1 p1, TParam2 p2);
Versão assíncrona da operação síncrona segundo
o padrão TAP
Task<TRetorno> NomeOperacaoAsync(TParam1 p1, TParam2 p2);
Opcionais: cancelamento e progresso
Task<TRetorno> NomeOperacaoAsync(TParam1 p1, TParam2 p2
[, CancellationToken cancellationToken]
Cancelamento
[, IProgress<T> progress]);
Progresso
21. Funções assíncronas
Principais novidades da linguagem C# 5
Tipos de retorno das funções
assíncronas
Deve ser void, Task ou Task<TResult>
Avaliação de funções assíncronas
Inicialmente idêntica a uma função
síncrona
Quando atinge uma expressão await, a
função assíncrona deve retornar
imediatamente ao seu chamador
Se a função assíncrona não for void,
um objeto Task ou Task<TResult>
será retornado para o chamador
22. Windows Runtime
Principais novidades da linguagem C# 5
Windows Runtime
Nova biblioteca da próxima versão do
Windows projetada para ser usada com
JavaScript, C#, Visual Basic e C++
Modelo de programação assíncrona
Interface IAsyncOperation<T>
O compilador automaticamente
transforma código normal em uma
máquina de estado de callback
23. async e await
Principais novidades da linguagem C# 5
O suporte a funções assíncronas
será incorporado à linguagem C# 5
Novas palavras-chaves: async e await
A palavra-chave await é usada para
marcar chamadas assíncronas
Dispensa a criação de funções de callback
A palavra-chave async deve estar
na assinatura de funções que
fazem chamadas assíncronas
await somente pode ser usada
na chamada de funções com
async na assinatura
24. async e await
Principais novidades da linguagem C# 5
async Task<decimal> calcularVendasAsync(string arquivo)
{
using (TextReader leitor = new StreamReader(arquivo))
{
string linha = null;
decimal total = 0M;
while ((linha = await leitor.ReadLineAsync()) != null)
{
string[] campos = linha.Split(';');
total += decimal.Parse(campos[campos.Length - 1]);
}
return total;
}
}
26. Projeto Roslyn
Compilador como um serviço
Tradicionalmente, compiladores são
caixas pretas
O projeto Roslyn muda este modelo
Abertura dos compiladores Visual Basic
e C# como APIs
Modelos de objetos da linguagem para:
Geração e análise de código
Refatoração
Suporte para scripting e interatividade com
Visual Basic e C#
27. Compiler-as-a-Service (CaaS)
Principais novidades do projeto Roslyn
Classe
Laço
Meta-programação public Classe1 Ler-Avaliar-Imprimir
Campo
Modelo de objetos Incorporação de
da linguagem private campo1
DSL (Domain
string Specific Language)
Código-fonte Assembly
Código-fonte Assembly
.NET
Código-fonte Compilador Assembly
.NET
.NET
28. APIs para o CaaS
Principais novidades do projeto Roslyn
Edit and Continue
Go To Definition
Extract Method
Completion List
Object Browser
Signature Help
Navigate To
References
Quick Info
Formatter
Outlining
Colorizer
Rename
Find All
Serviços
da
linguagem
APIs do
compilador
Pipeline do Symbols
compilador Binding and
Syntax Symbol IL
Emit
Parser Binder
Flow Analysis
Tree API API
Metadata Emitter
API
Import
APIs
29. Microsoft “Roslyn” CTP
Community Technology Preview
Microsoft “Roslyn” October 2011 CTP
Liberado no dia 19 de outubro de 2011
Para ser instalado no Visual Studio 2010 SP1
Somente um subconjunto das linguagens
Visual Basic e C# foram implementadas neste
primeiro CTP
Microsoft “Roslyn” no site da Microsoft
http://msdn.microsoft.com/roslyn
30. Resumo
A linguagem C# está em evolução constante
A evolução da linguagem C#
C# 1.0 em fevereiro de 2002 (.NF 1.0)
C# 2.0 em novembro de 2005 (.NF 2.0)
C# 3.0 em novembro de 2007 (.NF 3.5)
C# 4 em abril de 2010 (.NF 4)
C# 5 em 2012 (.NF 4.5)
Suporte ao Windows Runtime
Facilidade na programação assíncrona
Projeto Roslyn
Compiler-as-a-Service (CaaS)
Microsoft “Roslyn” October 2011 CTP (19/10/2011)