microsoft.com Home

 
Por que o C# é melhor que o Java, Parte I

  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

      
 


Microsoft Certified Partners
M.A.S. Informática LTDA.
Al. Campinas, 433 - 13º Andar, Conjunto 132 - Jardim Paulista
CEP: 01404-901 - São Paulo - SP, Tel.: (PABX) (011) 3284-0466/ 287-9622 - Fax: (011) 287-5593