Camping 1(C#) - Conteúdo
Autor: Joao Vytor | Publicado: 2010-03-14T11:48:00-07:00

Campus - (C#) Aula 1   A Microsoft lançou a linguagem C# em meados do ano 2000. Desde então, um dos argumentos mais usados pelos concorrentes para desmerecer a nova linguagem é que “o C# não passa de um clone do Java”. Este artigo mostra que embora existam várias semelhanças, o C# traz diversos recursos importantes e que simplesmente não existem ou são muito difíceis de implementar no Java. Linguagem ou Plataforma? Em primeiro lugar, antes de fazer qualquer comparação entre Java e alguma outra tecnologia, é bom enfatizar que “Java” pode significar duas coisas bastante diferentes: Uma     linguagem de programação.   Uma     plataforma de execução, que inclui, no mínimo, um “runtime” e uma     biblioteca de classes, usualmente conhecidos como “Java Virtual Machine”. Por uma questão de objetividade, esta comparação limita-se à linguagem de programação Java e não compara as plataformas da Sun e da Microsoft. Algumas características bastante interessantes no desenvolvimento de software, como por exemplo, o amplo suporte a diferentes culturas presente no C# foram deixados de lado por tecnicamente fazerem parte da “.NET Framework”. Não estou também comparando o Visual Studio.NET com nenhum ambiente integrado de desenvolvimento para Java, embora o Visual Studio seja, na minha opinião, um produto muito mais completo. Semelhanças O C# foi sem dúvida influenciado por diversas linguagens, dentre as quais evidentemente Java, C++, Delphi e Smalltalk. Veja no quadro a seguir algumas  das semelhanças com o Java:                                    Semelhanças           entre C# e Java                                                                 Característica                                                   Implementação                                                                 Inspirado no C/C++                             Boa parte da sintaxe de ambas as           linguagens foi inspirada no C/C++, especialmente declaração de variáveis,           funções e estruturas de controle.                                           Orientação a objetos                             Ambas as linguagens suportam           conceitos de programação orientada a objetos com a palavra reservada           class.                                           Herança                             Herança simples de classes a           partir de ancestral comum e herança múltipla de interfaces.                                           Gerenciamento de memória                             Automático, com “coletor de           lixo”.                                           Tipagem forte                             Todas as atribuições tem os           tipos validados. Os “casts” são sempre verificados em tempo de           execução. Não é possível violar o sistema de tipos.                                           Compila para código intermediário                             Sim. No caso da Microsoft compila           para “Intermediate Language” e no Java para “bytecode”.                                           Tratamento de erro                             Exceptions.                                           Reflections                             Ambas as linguagens suportam           “reflections”.                                           Unicode                             Ambas as linguagens usam o padrão           Unicode para representar caracteres e strings.                                           Classe que não pode ser herdada                             “final” em Java; “sealed”           em C#.                                           Campo constante                             “static final” em Java;           “const” em C#.                                           Operador que verifica           compatibilidade de tipos                             “instanceof” em Java; “is”           em C#.                          Os aspectos acima são auto-explicativos e refletem o pensamento atual no desenvolvimento de software, especialmente o uso de orientação a objetos em um ambiente “gerenciado”, no qual o programa não pode danificar o ambiente de execução. Novidades do C# O C# tem diversas novidades que tornam o desenvolvimento de software mais fácil e produtivo, como mostrado a seguir:                                    Recursos           novos no C#                                                                 Característica                                                   Java                                                   C#                                                                 Compilado para código nativo                             Raramente. O Java é quase sempre           interpretado.                             Sempre compilado para código           nativo. A compilação pode ser feita na instalação ou na primeira           execução do programa.                                           Todos os tipos derivados de           ancestral comum                             Não.                             Sim, todos os tipos são derivados           de object.                                           “Boxing” e “Unboxing” -           conversão de tipos por valor para tipos por referência                             Não. Exige conversão manual.                             Sim.                                           Structs                             Não.                             Sim.                                           Enum                             Não.                             Sim.                                           Passagem de parâmetros por referência                             Não.                             Sim, de duas maneiras: ref           para parâmetros de entrada e saída e out para parâmetro           apenas de saída.                                           Propriedades                             Não. Podem ser simuladas com métodos           Get/Set, com alguma dificuldade.                             Sim, diretamente. A criação de           “componentes” é bastante facilitada.                                           Eventos e Delegates                             Não, categoricamente (veja link           abaixo).                             Sim. Um “delegate” é um           “ponteiro de função orientado a objetos”, permitindo a associação           de um evento de uma classe ao código de outra de maneira           conceitualmente simples e poderosa.                                           Atributos                             Não.                             Sim, permitindo “etiquetar” o           código com características que são interrogadas em tempo de execução           através de “reflection”.                                           Ponteiros                             Não suportado diretamente, apenas           indiretamente através de “referências”.                             A princípio suporta referências,           mas os ponteiros podem ser usados em código “inseguro” por questões           de performance ou compatibilidade com DLLs.                                           Sobrecarga de operadores                             Não.                             Sim.                                           Operadores de conversão                             Não.                             Sim.                                           Operadores de cast                             Um, sintaxe semelhante ao C/C++.                             Dois, um semelhante ao C/C++ e o           outro “as”. Um retorna null e outro dispara exception           em casso de erro de conversão.                                           Inteiros sem sinal                             Não.                             Sim.                                           Tipo numérico pouco sujeito a           erros de representação e arredondamento                             Não.                             Sim, o tipo decimal pode           ser usado em softwares que não toleram facilmente erros de           arredondamento, como programas de contabilidade                                           Forech: loop para varrer arrays e           coleções                             Não.                             Sim.                                           Campo readonly                             Não.                             Sim.                                           Documentação integrada em XML                             Não.                             Sim, permitindo que o programador           escreva facilmente a documentação enquanto programa. Este documentação           pode depois ser extraída do fonte ou usada no próprio ambiente de           desenvolvimento.                                           Switch com           strings                                                   Não.                             Sim, facilitando o           desenvolvimento.                                           Controle sobre “estouro de           faixa” numérica                             Não.                             Sim. As palavras reservadas checked           e unchecked permitem mudar o que o programa faz quando há           um “estouro de faixa numérica”: o checked dispara uma exception;           o unchecked não.                                           Funções com número variável de           parâmetros                             Não.                             Sim, de forma “tipada”, com a           palavra reservada params.                                           Formas do método Main                             Uma.                             Quatro. O main pode aceitar um           array de strings ou nada; pode retornar inteiro ou nada.                                           Goto                             Não.                             Sim, com a restrição de que não           pode entrar em um bloco.                                           Arquivo “executável”           independente do namespace                             Um “package” Java           obrigatoriamente está associado a um único arquivo “.class”.                             Não existe relação direta entre           o “namespace” e a DLL que o implementa, dando mais flexibilidade           ao desenvolvedor na hora de quebrar seus projetos em pedaços menores.                                           Especificadores de acesso                             Quatro.                             Cinco. O internal,           adicional, especifica acesso apenas no mesmo “assembly” (mesma           DLL, a grosso modo).                                           Diretivas de compilação           condicional (#ifdef etc)                             Não.                             Sim.                                           Destrutores                             Não, mas o método Finalize           pode ser usado.                             Sim.                                           Padronização por algum organismo           internacional                             Não. Duas submissões da Sun           foram posteriormente retiradas.                             Sim. Submetido e aceito pelo ECMA           (http://www.ecma.ch).                                           Chama APIs do Windows e DLLs                             Não. Mesmo o suporte “nativo”           de alguns compiladores é extremamente limitado pela falta de           ponteiros na linguagem.                             Sim.                                           Chama objetos COM/COM+                             Não.                             Sim.                                           Cria objetos COM/COM+                             Não.                             Sim.                          Existem alguns pontos importantes por trás dos tópicos acima: O     C# implementa características interessantes do C++ que foram     removidas no Java, como passagem de parâmetros por referência, enum,     struct, sobrecarga de operadores, operadores de conversão e compilação     condicional;   O     C# tem vários recursos que melhoram a performance, como uso de     “tipos por valor” (structs e enums) em situações simples     onde o uso de uma classe seria muito “caro” e suporte direto a     ponteiros;   Suporte     direto a componentes, através de a propriedades e eventos;   A     unificação do sistema de tipos (tudo é derivado de object) e a     conversão de valores para referências através de “boxing” são     recursos que, ao mesmo tempo simplificam a programação, como também     permitem melhores abstrações;   Boa     integração com código anterior escrito para Windows: suporte a ponteiros,     chamar DLLs, chamar objetos COM e criar objetos COM. Não é necessário     abandonar o C# para usar alguma facilidade não contemplada pela     biblioteca de classes;   Diversos     recursos que facilitam a programação, como switch com strings,     “loop” foreach para varrer todos os elementos de uma coleção ou     array, campo readonly; Conclusão Embora compartilhe características com o Java, o C# é uma linguagem que traz vários recursos muito interessantes que não ou existem no Java ou dão muito trabalho para implementar ou têm performance ruim.   Leitura interessante na Web Introdução ao C#:http://msdn.microsoft.com/vstudio/nextgen/technology/csharpintro.asp Artigo da MSDN Magazine:http://msdn.microsoft.com/msdnmag/issues/0900/csharp/csharp.asp Artigo da Doctor Dobb’s Journal sobre C#:http://www.ddj.com/articles/2000/0065/0065g/0065g.htm Site de C# da O’Reyley, com vários artigos comparativos:http://www.oreillynet.com/topics/dotnet/csharp.net Artigo da Sun “explicando” porque o Java não tem nem terá delegates:http://java.sun.com/docs/white/delegates.html Resposta da Microsoft mostrando porque os delegates são úteis:http://msdn.microsoft.com/archive/default.asp?url=/ARCHIVE/en-us/dnarvj/html/msdn_deltruth.asp Sobre o prêmio da DDJ a Anders Hejlsberg, o criador do C#:http://www.ddj.com/articles/2001/0105/0105a/0105a.htm Entrevista de Anders Hejlsberg:http://www.dnjonline.com/teched2001/Hejlsberg_head2head.html Mais uma entrevista com Anders Hejlsberg:http://news.cnet.com/news/0-1003-200-5677521.html?tag=tp_pr Coluna fictícia (e engraçada) sobre Anders Hejlsberg:http://www.ddj.com/columns/stob/2001/0106vs001.htm