As versões iniciais do C# (lançadas entre 2002 e 2003) evoluíram rapidamente com melhorias pontuais, mas significativas. O C# 1.2, embora uma atualização menor, trouxe melhorias que impactaram diretamente a segurança e a performance do código. Vamos explorar essas diferenças com exemplos práticos.
📌 O que havia no C# 1.0
Lançado junto com o .NET Framework 1.0, o C# 1.0 incluía os elementos básicos da linguagem moderna:
- Tipos base (class, struct, interface, enum)
- Delegates e eventos
- Propriedades
- Tratamento de exceções
- Atributos personalizados
- Coleções com
foreach
✅ Exemplo clássico de foreach
em C# 1.0:
string[] nomes = { "Ana", "Bruno", "Carlos" };
foreach (string nome in nomes)
{
Console.WriteLine(nome);
}
🔍 Em C# 1.0, o compilador não chamava automaticamente
Dispose()
de um iterador, mesmo que ele implementasseIDisposable
.
🆕 O que foi adicionado no C# 1.2
A versão C# 1.2 (abril de 2003) introduziu duas mudanças sutis, porém importantes:
1. Chamada automática de Dispose()
no foreach
Antes do C# 1.2, se você iterasse sobre um objeto que implementava IDisposable
, era necessário chamar manualmente o método Dispose
. A partir do 1.2, o compilador passou a gerar esse código automaticamente.
🔄 Exemplo comparativo
Antes (C# 1.0) – sem Dispose
automático:
public class MeuIterator : IEnumerator, IDisposable
{
public object Current => null;
public bool MoveNext() => false;
public void Reset() {}
public void Dispose()
{
Console.WriteLine("Dispose chamado manualmente");
}
}
Depois (C# 1.2) – Dispose()
chamado automaticamente ao fim do foreach
:
IEnumerable recursos = new List<IDisposable> { new MeuIterator() };
foreach (IDisposable recurso in recursos)
{
// Ao sair do loop, Dispose será chamado automaticamente
}
2. Especialização do foreach
para string
No C# 1.0, foreach
funcionava com IEnumerable
, mas strings eram tratadas genericamente. No C# 1.2, o compilador passou a otimizar esse uso para iteração direta sobre os caracteres da string.
🔤 Exemplo:
string texto = "Olá";
foreach (char c in texto)
{
Console.WriteLine(c);
}
⚙️ Internamente, o compilador passou a gerar código mais eficiente, tratando
string
como uma sequência dechar
com acesso direto por índice.
📊 Tabela Comparativa: C# 1.0 vs C# 1.2
Recurso | C# 1.0 | C# 1.2 |
---|---|---|
foreach com Dispose() automático |
❌ | ✅ |
Otimização do foreach para string
|
❌ | ✅ |
Tipos base e delegação | ✅ | ✅ |
Propriedades e eventos | ✅ | ✅ |
✅ Conclusão
Apesar de ser uma atualização menor, o C# 1.2 trouxe otimizações importantes para o uso do foreach
, reduzindo erros de liberação de recursos e melhorando o desempenho ao iterar sobre strings. Essas melhorias ajudaram a consolidar boas práticas de programação segura e eficiente já nas primeiras versões da linguagem.