|
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
©
Copyright 2001 por Mauro Sant’Anna – Todos os direitos reservados |