O documento descreve a evolução da linguagem C# ao longo de suas versões, desde a versão 1.0 em 2002 até a versão mais recente no projeto Roslyn. As principais novidades incluem: suporte a generics, LINQ, parâmetros opcionais, tipos dinâmicos, programação assíncrona e novas APIs no compilador Roslyn.
1. Rogério Moraes de Carvalho
VITA Informática
@rogeriomc
rogeriomc.wordpress.com
2. 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, ...
3. 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
4. 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
5. 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
6. 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
13. 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 };
Tipos implícitos
em variáveis Expressões
locais lambda
Árvores de
var mulheres =
expressão
contatos
.Where(c => c.Sexo == Sexo.Feminino) Propriedades
.Select(c => new {c.Nome, c.Email}); automáticas
Métodos de Tipos Iniciadores de Métodos
extensão anônimos objetos parciais
Iniciadores de
coleções
14. 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>
Bancos de dados
Objetos relacionais XML
19. Objetos com tipagem dinâmica
Principais novidades da linguagem C# 4
Calculadora calc = ObterCalculadora();
int soma = calc.Adicionar(10, 20);
object calc = ObterCalculadora();
Type tipoCalc = calc.GetType();
object res = ScriptObject calc = ObterCalculadora();
tipoCalc.InvokeMember("Adicionar",
object res = calc.Invoke("Adicionar", 10, 20);
BindingFlags.InvokeMethod, null,
int soma = Convert.ToInt32(res);
new object[] { 10, 20 });
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
20. 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
public interface IEnumerator<T> T>
IEnumerator<out específica
{
T Current { get; } IEnumerable<string> str = ObterStrings();
bool MoveNext(); IEnumerable<object> obj = str;
} 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;
22. 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
23. 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
24. 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
25. 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
26. 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
27. 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;
}
}
29. 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 Compilador Assembly
.NET
Código-fonte Assembly
.NET
.NET
30. 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
Serviços
Rename
Find All
da
linguagem
APIs do
compilador
Symbols Binding and
Pipeline do Syntax Symbol IL
Emit
Parser Binder
Flow Analysis
compilador Tree API API
Metadata Emitter
API
Import
APIs
31. Considerações finais
A linguagem C# está em evolução constante
A evolução da linguagem C#
C# 1.0 em fevereiro de 2002 (.NET 1.0)
C# 2.0 em novembro de 2005 (.NET 2.0)
C# 3.0 em novembro de 2007 (.NET 3.5)
C# 4 em abril de 2010 (.NET 4)
C# 5 em 2012 (.NET 4.5)
Suporte ao Windows Runtime
Facilidade na programação assíncrona
Projeto Roslyn
Compiler-as-a-Service (CaaS)
Visual Studio Roslyn CTP
Previsão: meados de outubro/2011