Estou me aventurando pelo mundo do C#. Sim, desenvolvendo em plataforma Microsoft, quem diria..
A experiência acumulada como programador em Delphi e outras linguagens muitas vezes ajuda, pois já tenho mais ou menos uma idéia de como fazer a maioria das coisas. Ou pelo menos uma idéia de como procurar a resposta. Mas isso é mais difícil quando alguma característica muda drasticamente de uma linguagem para outra.
O que eu pretendo fazer a partir de agora é documentar aqui as características que encontrar no C# que eu julgar que vale a pena comparar com o correspondente em Delphi, tanto por ser semelhante, quanto por ser diferente (e me ter tomado mais tempo do que deveria). Sim, às vezes já saber fazer de um outro jeito nos faz meio “viciados”, e demoramos mais a achar a solução do que se não soubéssemos de forma alguma.
Mas vamos ao primeiro assunto.
Tipos enumerados
O primeiro item que me chamou atenção foram os tipos enumerados. Embora não pareça ter muita importância, tipos enumerados são usados para todos os lados, principalmente como parâmetros de entrada de métodos que podem se comportar de mais de uma forma. Então, saber utilizá-los vai sim adiantar o aprendizado.
Os tipos enumerados do Delphi não têm exatamente a mesma estrutura no .NET Framework. Os itens de um tipo enumerado são usados no Delphi como se fossem um conjunto de constantes, acessadas diretamente e internamente representam um valor inteiro. Como são acessadas diretamente, alguns programadores várias constantes mais comuns por anos sem sequer saber o que é um tipo enumerado.
Exemplo:
{ Declaração do tipo; internamente os valores equivalem a 0, 1 e 2 }
TFruta = (fBanana, fMaca, fManga)
...
var fruta = TFruta; // Variável do tipo TFruta
begin
fruta := fBanana; // Atribuição do valor do tipo TFruta à variável
...
end;
Em C# a coisa é um pouco mais “OO-like”. Os tipos enumerados não são simplesmente um tipo, são uma classe, com seus membros sendo os valores possíveis. Então por exemplo, um tipo enumerado Fruta semelhante ao descrito acima, seria acessado assim:
/* Declaração da variável e atribuição do valor */
Fruta fruta = Fruta.Banana;
Os valores são acessados usando <NOME DA CLASSE>.<ITEM DESEJADO>. Dessa forma, além de definir de forma clara qual o domínio daquela constante, definindo as constantes dessa forma evita o conflito de nomes, ou seja, tipos enumerados diferentes contendo constantes com o mesmo nome, significando coisas diferentes.