Weitere ähnliche Inhalte Ähnlich wie Linguagem de programação C# 4 e 5 (20) Mehr von Rogério Moraes de Carvalho (20) Linguagem de programação C# 4 e 51. Plataforma Java x Plataforma .NET
Edição SP 2010
Tema 2
Linguagem de programação
Linguagem de programação C# 4
Novidades da próxima versão: C# 5
Rogério Moraes de Carvalho
Twitter: @rogeriomc
rogeriom@gmx.net
2. Edição SP 2010
Plataforma Java x Plataforma .NET Agenda
A evolução da linguagem C#
C# 1.0: A linguagem
C# 1.0: Tipos por valor e por referência
C# 1.0: Arrays
C# 1.0: Sistema unificado de tipos
C# 1.0: Gerenciamento de memória
C# 1.0: Classes e seus membros
C# 1.0: Acessibilidade de membros
C# 1.0: Exemplo de membros
C# 1.0: Estrutura
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 2
3. Edição SP 2010
Plataforma Java x Plataforma .NET Agenda
C# 1.0: Estruturas versus classes
C# 1.0: Interfaces
C# 1.0: Herança e polimorfismo
C# 1.0: Enumerações
C# 1.0: Delegates
C# 2.0: Generics, Iterators, ...
C# 2.0: Métodos anônimos, ...
C# 2.0: Classes estáticas, ...
C# 3.0: Novidades
C# 3.0: Objetivos do projeto
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 3
4. Edição SP 2010
Plataforma Java x Plataforma .NET Agenda
C# 3.0: LINQ
C# 3.0: Expressões de consulta
C# 3.0: Expressões de consulta
C# 3.0: Inovações na linguagem
C# 4: Inovações
C# 4: Objetos tipados dinamicamente
C# 4: Parâmetros opcionais e nomeados
C# 4: Interoperabilidade com COM
C# 4: Covariância e contravariância
Demonstração
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 4
5. Edição SP 2010
Plataforma Java x Plataforma .NET Agenda
C# 5: Compilador como um serviço
Conclusão
Referências
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 5
6. Edição SP 2010
Plataforma Java x Plataforma .NET A evolução da linguagem C#
C# 5 Compilador como um serviço
(? 2012/2013)
Objetos tipados dinamicamente,
C# 4 parâmetros opcionais e nomeados,
(Abr 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, tipos anuláveis,
C# 2.0 classes estáticas, métodos anônimos, ...
(Nov 2005)
Código gerenciado, linguagem de POO, suporte nativo a
C# 1.0 propriedades e eventos, documentação XML, exceções,
(Fev 2002) segurança de tipos, delegates, sobrecarga de operadores, ...
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 6
7. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: A linguagem
C# (C Sharp)
Linguagem de programação simples, moderna, orientada a
objetos e de tipos de seguros
“Olá, mundo!” em C#
using System;
class OlaMundo
{
static void Main() {
Console.WriteLine("Olá, mundo!");
}
}
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 7
8. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Tipos por valor e por referência
C# suporta duas classificações de tipos
Tipos por valor (value types)
Tipos enumerações enum Cor { Vemelho, Verde, Azul }
Tipos estruturas struct Ponto { ... }
Algumas estruturas pré-definidas: bool, char, int, double, ...
Tipos por referência (reference types)
Tipos classes class Pessoa { ... }
Tipos interfaces interface IConexao { ... }
Tipos delegates delegate void Acao();
Tipos arrays int[] primos = { 2, 3, 5, 7, 11 }
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 8
9. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Arrays
O que é um array?
É uma estrutura de dados que contém um número fixo
de variáveis chamadas de elementos do array
Os elementos do array são acessados por índices iniciados em zero
Tipos de arrays
Unidimensionais int[] arr = new int[5];
Multidimensionais
Retangulares Irregulares
int[,] a2; int[][] j2;
int[,,] a3; int[][][] j3;
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 9
10. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Sistema unificado de tipos
O C# fornece um sistema de tipos unificado
Todos os tipos, incluindo tipos por valor, derivam do tipo
object (System.Object)
É possível chamar métodos da classe object em qualquer
valor, mesmo em valores de tipos “primitivos” como int
Ao armazenar um tipo por valor numa variável do tipo
object, ocorre um processo denominado boxing
using System; class Boxing
{
class IntParaString static void Main() {
{ int i = 123;
static void Main() { // Boxing
Console.WriteLine( object o = i;
3.ToString("C") // Unboxing
); int j = (int)o;
} }
} }
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 10
11. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Gerenciamento de memória
Gerenciamento manual de memória
Requer que o desenvolvedor gerencie a alocação e
liberação de blocos de memória
Tarefa repetitiva e sujeita a erros
Gerenciamento automático de memória
Usado pelo C# para livrar os desenvolvedores da tarefa
cansativa de gerenciar a memória
O serviço do CLR (Common Language Runtime) responsável
pela liberação da memória usada por objetos é
denominado coletor de lixo (garbage collector)
Um objeto se torna elegível a ser coletado pelo coletor de
lixo quando não há a possibilidade de nenhum código
acessá-lo
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 11
12. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Classes e seus membros
Classes Membros de classes
Definem novos tipos por Classes podem ter os
referência seguintes tipos de
Uma classe pode herdar membros
de outra classe Constantes
Herança simples (de uma Campos
única classe) Propriedades
Uma classe pode Indexadores (indexers)
implementar múltiplas Métodos
interfaces Eventos
Operadores
Construtores
Destrutores
Tipos aninhados
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 12
13. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Acessibilidade de membros
Acessibilidade de membros de classes
Cada membro tem uma acessibilidade associada
Controla as regiões de texto de programa que estão habilitadas a
acessar o membro
Modificador
Acessibilidade
de acesso
public Acesso ilimitado
Acesso limitado ao tipo contêiner ou tipos
protected
derivados deste tipo
internal Acesso limitado ao assembly
Acesso limitado ao tipo contêiner ou tipos
protected
derivados deste tipo ou ao assembly
internal
(protected + internal)
private Acesso limitado ao tipo contêiner
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 13
14. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Exemplo de membros
Classe com cada um dos tipos de membros
class Classe {
public const int Constante = 12;
private int campo;
private static int campoEstatico = 34;
public void MetodoSemParametroNemRetorno() { ... }
public string MetodoComParametroComRetorno(double d) { ... }
public int Propriedade {
get{ return campo; }
set { campo = value; }
}
public int PropriedadeSomenteLeitura { get{ ... } }
public event EventHandler Evento;
public int this[int index] { get { ... } set { ... } }
public static Classe operator +(Classe a, Classe b) { ... }
public Classe() { ... }
public Classe(int valor) { ... }
static Classe() { ... }
~Classe() { ... }
class ClasseAninhada { ... }
}
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 14
15. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Estrutura
Conceito de estrutura
É um tipo por valor que, com algumas exceções, permite a
definição dos mesmos tipos de membros que as classes
Uma vez que não é um tipo por referência, o valor de uma estrutura
é armazenada na memória “stack” (“in-line”)
Deste modo, a liberação do valor de uma estrutura não é realizada
pelo coletor de lixo (garbage collector)
Por este motivo, uma estrutura não suporta o membro destrutor
Estruturas podem implementar interfaces, mas não suportam
herança
Quando usar estruturas ao invés de classes?
Geralmente, estruturas devem ser utilizadas em tipos que
armazenam poucos dados
Recomenda-se usar estruturas com, no máximo, 16 bytes (128 bits)
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 15
16. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Estruturas versus classes
Exemplo da declaração de uma estrutura versus a
declaração de uma classe
struct Ponto { class Ponto {
private int x, y; private int x, y;
public int X { public int X {
get { return x; } get { return x; }
set { x = value; } set { x = value; }
} }
public int Y { public int Y {
get { return y; } get { return y; }
set { y = value; } set { y = value; }
} }
public Ponto(int x, int y) { public Ponto(int x, int y) {
this.x = x; this.x = x;
this.y = y; this.y = y;
} }
} }
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 16
17. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Interfaces
Conceito de interface
Uma interface define um contrato
Classes e estruturas podem implementar múltiplas interfaces
Características de uma interface
Interfaces podem ter os seguintes membros
Métodos, propriedades, eventos e indexers
Exemplo da declaração de uma interface
using System;
interface IInterface
{
string this[int indice] { get; set; }
event EventHandler Evento;
void Metodo(int valor);
string Propriedade { get; set; }
}
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 17
18. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Herança e polimorfismo
Classes abstratas
Classes definidas para serem classes bases de outras classes
abstract class ClasseAbstrata { ... }
Membros virtuais (palavra-chave virtual)
Permite que um membro seja sobrescrito na classe derivada
Métodos, propriedades, indexadores e eventos podem ser virtuais
using System;
class Classe {
public virtual void MetodoPolimorfico { ... }
public virtual int PropriedadePolimorfica { get; set; }
public virtual Classe this[int indice] { get; set; }
public virtual event EventHandler EventoPolimorfico;
}
Por padrão, membros não virtuais de uma classe não são
polimórficos
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 18
19. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Enumerações
Conceito de enumeração
É um tipo por valor que herda da classe System.Enum e
fornece nomes para substituir os valores de um tipo
primitivo base
Restrições de uma enumeração
Em C#, uma enumeração não pode:
definir seus próprios métodos, propriedades ou eventos
implementar interfaces
Exemplo da declaração de uma enumeração
enum FormaPagamento {
Dinheiro,
Cheque,
BoletoBancario,
CartaoCredito
}
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 19
20. Edição SP 2010
Plataforma Java x Plataforma .NET C# 1.0: Delegates
O que é um delegate?
Um tipo por referência usado para referenciar um método
com uma assinatura compatível
Similar a ponteiro de função em C++, mas é um tipo seguro
Delegates são usados por manipuladores de eventos e métodos de
retorno (callback)
Exemplos de declarações de delegates
using System;
delegate void Acao();
delegate void EventHandler(object sender, EventArgs e);
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 20
21. Edição SP 2010
Plataforma Java x Plataforma .NET C# 2.0: Generics, Iterators, ...
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 avançado 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
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
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 21
22. Edição SP 2010
Plataforma Java x Plataforma .NET C# 2.0: Métodos anônimos, ...
Tipos anuláveis
Permitem que uma variável de tipo por valor contenha um
valor indefinido
Úteis ao se trabalhar com bancos de dados ou outras estruturas
Métodos anônimos
Torna possível a passagem de um bloco de código como um
parâmetro
Em qualquer lugar que um delegate é esperado, um bloco de código
pode ser passado
Não há a necessidade da definição de um novo método
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
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 22
23. Edição SP 2010
Plataforma Java x Plataforma .NET C# 2.0: Classes estáticas, ...
Classes estáticas
Fornece um modo seguro e conveniente de declarar uma
classe que não pode ser instanciada e contém somente
métodos estáticos
Anteriormente era necessário definir o construtor default da classe
como privado para não permitir que a mesma fosse instanciada
Acessores de uma propriedade
Permite a definição de diferentes níveis de acesso aos
acessores get e set de uma propriedade
Covariância e contravariância em delegates
Maior flexibilidadenos tipos de parâmetros e tipo de
retorno de um método passado para um delegate
Dentre outros avanços na linguagem C#
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 23
24. Edição SP 2010
Plataforma Java x Plataforma .NET C# 3.0: Novidades
Novidades na linguagem C# 3.0
Propriedades implementadas automaticamente
Iniciadores de objetos
Iniciadores de coleções
Variáveis locais e arrays com tipos deduzidos
implicitamente
Métodos de extensão
Expressões lambda
Árvores de expressão
Tipos anônimos
Expressões de consulta
Métodos parciais
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 24
25. Edição SP 2010
Plataforma Java x Plataforma .NET C# 3.0: Objetivos do projeto
Integrar objetos, dados relacionais e XML
Tornar a linguagem ainda mais concisa
Adicionar construtores de programação funcional
Não vincular a linguagem a APIs específicas
Manter 100% de compatibilidade com a versão 2.0
Integrar a linguagem C# com o LINQ
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 25
26. Edição SP 2010
Plataforma Java x Plataforma .NET C# 3.0: LINQ
C# 3.0 ou superior VB 9.0 ou superior Outras linguagens…
.NET LINQ (Language INtegrated Query)
Outro
LINQ to LINQ to LINQ to LINQ to LINQ to
provedor
Objects DataSets SQL Entities XML
LINQ
<agenda>
<contato>
<nome>. . . </nome>
<email> . . . </email>
<fone/> . . . </fone>
<contato/>
...
</agenda>
Objetos Bancos de dados
relacionais XML
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 26
27. Edição SP 2010
Plataforma Java x Plataforma .NET C# 3.0: Expressões de consulta
Inicia com from
Zero ou mais from,
join, let, where ou
from id in fonte orderby
{ from id in fonte |
join id in fonte on expr equals expr [ into id ] |
let id = expressão |
where condição |
orderby id1, id2, … *ascending | descending] }
select expressão | group expressão by chave
[ into id ]
Termina com select
ou group by
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 27
28. Edição SP 2010
Plataforma Java x Plataforma .NET C# 3.0: Expressões de consulta
Expressões de consulta são traduzidas para
invocações de métodos de extensão
Where, Join, OrderBy, Select, GroupBy, …
from c in contatos
where c.Sexo == Sexo.Feminino
select new { c.Nome, c.Email };
contatos
.Where(c => c.Sexo == Sexo.Feminino)
.Select(c => new { c.Nome, c.Email });
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 28
29. Edição SP 2010
Plataforma Java x Plataforma .NET C# 3.0: Inovações na linguagem
Expressões
var mulheres = de consulta
from c in contatos
Tipos
where c.Sexo == Sexo.Feminino
Árvores de
implícitos select new { c.Nome, c.Email }; expressão
em variáveis
locais
Expressões Propriedades
lambda automáticas
var mulheres =
contatos
Métodos
.Where(c => c.Sexo == Sexo.Feminino) parciais
.Select(c => new { c.Nome, c.Email });
Métodos
de
extensão Tipos Iniciadores
anônimos de objetos
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 29
30. Edição SP 2010
Plataforma Java x Plataforma .NET C# 4: Inovações
Objetos tipados dinamicamente
Parâmetros opcionais e nomeados
Melhorias na interoperabilidade com COM
Covariância e contravariância
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 30
31. Edição SP 2010
Plataforma Java x Plataforma .NET C# 4: Objetos tipados dinamicamente
Calculadora calc = ObterCalculadora();
int soma = calc.Adicionar(10, 20);
object calc = ObterCalculadora();
Type TipoCalc = calc.GetType();
object resultado = calcType.InvokeMember(
"Adicionar", BindingFlags.InvokeMethod,
null, new object[] { 10, 20 });
int soma = Convert.ToInt32(resultado);
ScriptObject calc = ObterCalculadora();
object resultado = calc.Invoke("Adicionar", 10, 20);
int soma = Convert.ToInt32(resultado);
Tipagem estática
orientada para ser dynamic calc = ObterCalculadora();
int soma = calc.Adicionar(10, 20);
dinâmica
Conversão Invocação dinâmica
dinâmica do método
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 31
32. Edição SP 2010
Plataforma Java x Plataforma .NET C# 4: Objetos tipados dinamicamente
public static class Math
{
public static decimal Abs(decimal value);
public static double Abs(double value);
public static float Abs(float value);
public static int Abs(int value);
public static long Abs(long value);
Método escolhido em public static sbyte Abs(sbyte value);
tempo de compilação: public static short Abs(short value);
double Abs(double x) ...
}
double x = 1.75;
Método escolhido em
double y = Math.Abs(x);
tempo de execução:
double Abs(double x)
dynamic x = 1.75;
dynamic y = Math.Abs(x);
Método escolhido em
dynamic x = 2; tempo de execução:
dynamic y = Math.Abs(x); int Abs(int x)
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 32
33. Edição SP 2010
Plataforma Java x Plataforma .NET C# 4: Parâmetros opcionais e nomeados
public StreamReader OpenTextFile( Método primário
string path,
Encoding encoding,
bool detectEncoding,
int bufferSize);
Sobrecargas
public StreamReader OpenTextFile( secundárias
string path,
Encoding encoding,
bool detectEncoding); Chamadas ao método
primário com valores
public StreamReader OpenTextFile( padrões
string path,
Encoding encoding);
public StreamReader OpenTextFile(
string path);
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 33
34. Edição SP 2010
Plataforma Java x Plataforma .NET C# 4: Parâmetros opcionais e nomeados
public StreamReader OpenTextFile( Parâmetros opcionais
string path,
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 avaliados Argumentos
nomeados podem
na ordem da escrita nomeados precisam
aparecer em qualquer
ser os últimos
ordem
Argumentos não
OpenTextFile(
opcionais devem ser
bufferSize: 4096,
path: "foo.txt", especificados
detectEncoding: false);
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 34
35. Edição SP 2010
Plataforma Java x Plataforma .NET C# 4: Interoperabilidade com COM
object fileName = "Test.docx";
object missing = System.Reflection.Missing.Value;
doc.SaveAs(ref fileName,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing);
doc.SaveAs("Test.docx");
Parâmetros nomeados e opcionais
Modificador ref opcional
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 35
36. Edição SP 2010
Plataforma Java x Plataforma .NET C# 4: Covariância e contravariância
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 =
bool MoveNext(); GetStrings();
} 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 = GetComparer();
IComparer<string> strComp = objComp;
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 36
37. Edição SP 2010
Plataforma Java x Plataforma .NET Demonstração
Usando os conhecimento de SQL para criar consultas
com LINQ na linguagem C# 3.0 ou superior
Linguagem C# 3.0 ou superior
.NET LINQ (Language INtegrated Query)
LINQ to
Objects
Objetos
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 37
38. Edição SP 2010
Plataforma Java x Plataforma .NET C# 5: Compilador como um serviço
Classe
Laço
Meta-programação
public Classe1 Ler-Avaliar-Imprimir
Campo
Modelo de objetos Incorporação de
da linguagem private campo1
DSL
string (Domain Specific Language)
Arquivo
Assembly .NET
fonte
Source code Source code
Source code Compilador Source code
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 38
39. Edição SP 2010
Plataforma Java x Plataforma .NET Conclusão
A linguagem C#
Evolução constante incorporando cada vez mais recursos
e tornando a linguagem extremamente poderosa
C# 1.0 em fevereiro de 2002 (.NET Framework 1.0)
C# 2.0 em novembro de 2005 (.NET Framework 2.0)
C# 3.0 em novembro de 2007 (.NET Framework 3.5)
C# 4 em abril de 2010 (.NET Framework 4.0)
C# 5, provavelmente, no segundo semestre 2012 ou em 2013
Problemas das constantes evoluções da linguagem
Aliado ao poder, a linguagem de programação está se tornando
cada vez mais complexa
Está cada vez mais complicado para que desenvolvedores iniciantes
aprendam os recursos disponíveis das novas versões da linguagem C#
Diversos recursos introduzidos nas novas versões da linguagem exigem
domínio de conceitos complexos das versões anteriores
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 39
40. Edição SP 2010
Plataforma Java x Plataforma .NET Referências
Microsoft Channel 9
Expert to Expert:
Erik Meijer and Anders Hejlsberg
The Future of C#
http://channel9.msdn.com/Shows/Going+Deep/Expert-to-Expert-
Anders-Hejlsberg-The-Future-of-C
Visual C# Developer Center
Português brasileiro
http://msdn.microsoft.com/pt-br/vcsharp/
Inglês americano
http://msdn.microsoft.com/en-us/vcsharp/
Visual Studio Express e SQL Server Express (gratuitos)
http://www.microsoft.com/express/
© 2010 JavaVersusDotNet.com.br, Rogério Moraes de Carvalho (MVP da Microsoft) 40