Todo caminho do homem é reto aos seus olhos, mas o Senhor sonda os corações. Provérbios 21:2
A linguagem C# passou por diversas evoluções desde sua primeira versão. A mudança da versão 2.0 para a 3.0 foi particularmente marcante por trazer um conjunto poderoso de recursos que serviram de base para LINQ e para uma forma mais expressiva e funcional de programar.
Neste artigo, você vai entender:
- O que existia em C# 2.0
- Quais os recursos introduzidos no C# 3.0
- Exemplos práticos comparando os dois
- Por que essas mudanças foram importantes
🕰️ Contexto histórico
Versão | Lançamento | Destaques principais |
---|---|---|
C# 2.0 | 2005 | Generics, Nullable Types, Anonymous Methods |
C# 3.0 | 2007 | LINQ, Lambdas, var , Extension Methods |
🚫 O que C# 2.0 não tem (e C# 3.0 trouxe)
A seguir, você verá as principais funcionalidades novas da versão 3.0, que não existiam na versão 2.0.
1. ✅ Inferência de Tipo com var
C# 2.0:
string nome = "Danilo";
C# 3.0:
var nome = "Danilo"; // o compilador infere que é string
Útil para tipos anônimos e código mais limpo, especialmente com LINQ.
2. ✅ Expressões Lambda
C# 2.0 (usando delegate anônimo):
list.Find(delegate(int x) { return x > 10; });
C# 3.0 (com lambda):
list.Find(x => x > 10);
Mais legibilidade e base para LINQ.
3. ✅ Tipos Anônimos
var pessoa = new { Nome = "Ana", Idade = 28 };
Console.WriteLine(pessoa.Nome); // "Ana"
Permite criar objetos sem classes explícitas. Ideal para retornos em LINQ.
4. ✅ Inicializadores de Objetos e Coleções
var pessoa = new Pessoa { Nome = "Lucas", Idade = 20 };
var lista = new List<int> { 1, 2, 3 };
Menos código repetitivo para instanciar e configurar objetos.
5. ✅ Métodos de Extensão
public static class StringExtensions
{
public static bool EstaVazia(this string valor)
=> string.IsNullOrWhiteSpace(valor);
}
// Uso:
var nome = " ";
bool vazia = nome.EstaVazia();
Permite "adicionar métodos" a tipos existentes sem herança.
6. ✅ LINQ (Language Integrated Query)
var maiores = from pessoa in pessoas
where pessoa.Idade > 25
select pessoa.Nome;
Essa sintaxe declarativa só foi possível com os recursos anteriores (lambdas,
var
, etc.).
7. ✅ Árvores de Expressão (Expression Trees)
Expression<Func<int, bool>> exp = x => x > 10;
Muito utilizadas em LINQ-to-SQL, EF e bibliotecas como AutoMapper e MediatR.
8. ✅ Partial Methods
partial class Pessoa
{
partial void Validar();
}
Permite métodos que podem ou não ser implementados, úteis em código gerado.
🧠 Resumo comparativo
Funcionalidade | C# 2.0 | C# 3.0 |
---|---|---|
var (inferência de tipo) |
❌ | ✅ |
Lambda Expressions | ❌ | ✅ |
Tipos Anônimos | ❌ | ✅ |
Inicializadores de objeto | ❌ | ✅ |
Inicializadores de coleção | ❌ | ✅ |
Métodos de extensão | ❌ | ✅ |
LINQ | ❌ | ✅ |
Árvores de expressão | ❌ | ✅ |
Partial Methods | ❌ | ✅ |
🔍 Por que essas mudanças foram importantes?
Esses recursos deram origem a uma nova forma de programar em C#:
- Mais expressividade: código que representa melhor a intenção
- Base para LINQ: um dos maiores avanços na linguagem
- Abordagem mais funcional: menos boilerplate, mais composição
- Integração mais fluida com dados: especialmente bancos e coleções
🧪 Quer testar na prática?
Você pode ver a diferença criando dois projetos:
dotnet new console -f net2.0 -n CSharp2
dotnet new console -f net8.0 -n CSharp3Plus
Em CSharp2
, tente usar var
, lambdas ou LINQ — verá que eles não são suportados.
🤝 Conecte-se Comigo
Se você curte entender a evolução da linguagem C# e quer continuar se aprofundando em arquitetura e boas práticas, bora trocar ideias:
- 💻 Dev.to
- ✍️ Medium
- 📬 contato@dopme.io