Quais são as principais diferenças entre C # e Java?


209

Eu só quero esclarecer uma coisa. Esta não é uma pergunta sobre qual é a melhor, que parte deixo para outra pessoa discutir. Eu não ligo para isso. Fiz essa pergunta na minha entrevista de emprego e achei que seria útil aprender um pouco mais.

Estes são os que eu poderia inventar:

  • Java é "independente de plataforma". Hoje em dia você pode dizer que existe o projeto Mono , então o C # também pode ser considerado, mas acredito que é um pouco exagerado. Por quê? Bem, quando uma nova versão do Java é feita, ela está disponível simultaneamente em todas as plataformas suportadas, por outro lado, quantos recursos do C # 3.0 ainda estão faltando na implementação Mono? Ou é realmente CLR vs. JRE que devemos comparar aqui?
  • Java não suporta eventos e delegados. Até onde sei.
  • Em Java, todos os métodos são virtuais
  • Ferramentas de desenvolvimento: acredito que ainda não existe uma ferramenta como o Visual Studio. Especialmente se você trabalhou com edições de equipe, saberá o que quero dizer.

Por favor, adicione outras pessoas que julgue relevantes.

Atualização: Apenas me veio à mente, o Java não tem algo como atributos personalizados em classes, métodos etc. Ou não?


1
Os idiomas são diferentes das implementações de idiomas, que também são diferentes das bibliotecas. O que você está tentando comparar?
Miguel Ping


2
Encontrei este msdn.microsoft.com/en-us/library/ms836794.aspx Abrange a semelhança e a diferença entre C # e java.
Bipul

1
Você pode obter muitas das coisas mencionadas abaixo sobre Java com as bibliotecas corretas. Verifique, por exemplo, este código Java válido: new String [] {"james", "john", "john", "eddie"} .where (beginWith ("j")). Distinct (); Ele usa uma biblioteca chamada lombok-pg. Pode ser encontrado em github.com/nicholas22/jpropel
NT_

Respostas:


329

Comparando Java 7 e C # 3

(Alguns recursos do Java 7 não são mencionados aqui, mas a usingvantagem de todas as versões do C # sobre o Java 1-6 foi removida.)

Nem todo o seu resumo está correto:

  • Em Java, os métodos são virtuais por padrão, mas você pode torná-los finais. (Em C #, eles são selados por padrão, mas você pode torná-los virtuais.)
  • Existem muitos IDEs para Java, gratuitos (por exemplo, Eclipse, Netbeans) e comerciais (por exemplo, IntelliJ IDEA)

Além disso (e o que já está no seu resumo):

  • Os genéricos são completamente diferentes entre os dois; Os genéricos Java são apenas um "truque" em tempo de compilação (mas útil nisso). Em C # e .NET, os genéricos também são mantidos no tempo de execução e funcionam para tipos de valor e tipos de referência, mantendo a eficiência apropriada (por exemplo, a List<byte>como byte[]backup, em vez de uma matriz de bytes em caixa).
  • C # não possui exceções verificadas
  • Java não permite a criação de tipos de valor definidos pelo usuário
  • Java não possui sobrecarga de operadores e conversões
  • Java não possui blocos de iteradores para implementação simples de iteradores
  • Java não tem nada como LINQ
  • Em parte devido à falta de delegados, o Java não tem nada parecido com métodos anônimos e expressões lambda. Classes internas anônimas geralmente preenchem esses papéis, mas de maneira desajeitada.
  • Java não tem árvores de expressão
  • C # não tem classes internas anônimas
  • De fato, o C # não possui as classes internas do Java - todas as classes aninhadas no C # são como as classes aninhadas estáticas do Java
  • Java não tem classes estáticas (que não têm quaisquer construtores de instância, e não pode ser utilizado para variáveis, parâmetros, etc.)
  • Java não tem nenhum equivalente aos tipos anônimos do C # 3.0
  • Java não tem variáveis ​​locais digitadas implicitamente
  • Java não possui métodos de extensão
  • Java não possui expressões de inicializador de objetos e coleções
  • Os modificadores de acesso são um pouco diferentes - em Java (atualmente) não há equivalente direto a um assembly, portanto, não há idéia de visibilidade "interna"; em C #, não há equivalente à visibilidade "padrão" em Java, que leva em consideração o espaço para nome (e herança)
  • A ordem de inicialização em Java e C # é sutilmente diferente (o C # executa inicializadores de variáveis ​​antes da chamada em cadeia para o construtor do tipo base)
  • Java não possui propriedades como parte da linguagem; eles são uma convenção dos métodos get / set / is
  • Java não tem o equivalente ao código "inseguro"
  • A interoperabilidade é mais fácil em C # (e .NET em geral) que a JNI do Java
  • Java e C # têm idéias um pouco diferentes de enumerações. Os Java são muito mais orientados a objetos.
  • Java não possui diretivas de pré-processador (#define, #if etc em C #).
  • Java não tem equivalente de C # refe outpassa parâmetros por referência
  • Java não tem equivalente de tipos parciais
  • Interfaces C # não podem declarar campos
  • Java não possui tipos inteiros não assinados
  • Java não tem suporte de idioma para um tipo decimal. (java.math.BigDecimal fornece algo como System.Decimal - com diferenças - mas não há suporte para idiomas)
  • Java não tem equivalente de tipos de valor anuláveis
  • O boxe em Java usa tipos de referência predefinidos (mas "normais") com operações específicas neles. O boxe em C # e .NET é um caso mais transparente, com um tipo de referência sendo criado para o box pelo CLR para qualquer tipo de valor.

Isso não é exaustivo, mas abrange tudo o que consigo pensar de antemão.


24
@ Brian: Eu acho que os genéricos Java e os detalhes das classes internas muito rapidamente anula a idéia de Java alcançar superioridade através da simplicidade;)
Jon Skeet

8
@ OrangeDog: as pessoas que argumentam que estão brincando, IMO. É difícil ver como ser forçado a escrever um bloco explícito de tentativa / finalmente é menos propenso a erros do que uma declaração de uso, IMO. A maioria dos recursos "extras" do C # em comparação com o Java significa que você pode escrever menos código e que esse código pode ser mais legível.
perfil completo de Jon Skeet

17
@OrangeDog: Quão imparcial você é, por interesse? Sim, sou um entusiasta de C #, mas também tenho uma experiência bastante significativa em Java - afinal, é meu trabalho diário. Não é como se eu sou ignorante sobre como usar Java efetivamente.
perfil completo de Jon Skeet

8
@ OrangeDog: Para começar, a maioria dos desenvolvedores não escreve código usando "inseguro" até onde sei, então isso é um problema. Também acho que a provabilidade é um arenque vermelho - não acho que a provabilidade formal tenha muito a ver com o quão fácil é para um ser humano raciocinar sobre código. O que quero dizer é que, como alguém com bastante experiência em Java e C #, acho o C # uma linguagem muito superior em termos de produtividade e legibilidade. Se você sentir o contrário, poderá esclarecer seus níveis de experiência nos dois idiomas? Eu acho que é bastante relevante para a discussão.
precisa

21
@OrangeDog: Além disso, sua afirmação de que "poder fazer mais coisas aumenta a probabilidade de que você as faça de forma errada" também é uma IMO falácia ... porque pressupõe que se você não puder fazer algo usando um recurso do linguagem que facilita, você não precisará fazer nada. Isso é simplesmente falso - geralmente as tarefas que você precisa realizar em Java e C # são as mesmas, mas devido à falta de recursos, o Java dificulta a realização correta dessas tarefas. Ao simplificar a tarefa, o recurso diminui a probabilidade de que você faça errado.
21811 Jon Skeet

24

A seguir, uma referência excelente e detalhada de Dare Obasanjo sobre as diferenças entre C # e Java. Sempre me pego me referindo a este artigo ao alternar entre os dois.

http://www.25hoursaday.com/CsharpVsJava.html


2
@ Jon Skeet: você é o desenvolvedor mais ativo em C #. Por que você não mantém sua versão das diferenças de C # e Java? Aposto que as pessoas adorariam ler.
garras

1
@ garras: não tenho tempo para fazer tudo o que gostaria.
Jon Skeet

19
@Winston: Precisamos de uma lista de "diferenças entre Chuck Norris e Jon Skeet": 1) Chuck Norris sempre tem tempo; Jon deve modificar a TimeDateclasse para sempre ter tempo e ainda não teve tempo :(
RedFilter

11

O C # possui propriedades automáticas incrivelmente convenientes e também ajudam a manter seu código mais limpo, pelo menos quando você não possui lógica personalizada em seus getters e setters.


10

Recursos do C # ausentes em Java • O C # inclui tipos mais primitivos e a funcionalidade para capturar exceções aritméticas.

• Inclui um grande número de conveniências notacionais sobre Java, muitas das quais, como sobrecarga de operador e transmissões definidas pelo usuário, já são familiares à grande comunidade de programadores de C ++.

• A manipulação de eventos é um "cidadão de primeira classe" - faz parte do próprio idioma.

• Permite a definição de "estruturas", que são semelhantes às classes, mas podem ser alocadas na pilha (diferente das instâncias das classes em C # e Java).

• C # implementa propriedades como parte da sintaxe do idioma.

• C # permite que as instruções do switch operem em strings.

• C # permite métodos anônimos que fornecem a funcionalidade de fechamento.

• C # permite o iterador que emprega co-rotinas por meio de uma palavra-chave de rendimento no estilo funcional.

• O C # suporta parâmetros de saída, auxiliando no retorno de vários valores, um recurso compartilhado por C ++ e SQL.

• C # tem a capacidade de alias namespaces.

• O C # possui "Implementação explícita de membro", que permite que uma classe implemente especificamente métodos de uma interface, separados de seus próprios métodos de classe. Isso também permite implementar duas interfaces diferentes que possuem um método com o mesmo nome. Os métodos de uma interface não precisam ser públicos; eles podem ser feitos para serem acessíveis somente através dessa interface.

• C # fornece integração com o COM.

• Seguindo o exemplo de C e C ++, o C # permite chamadas por referência para tipos primitivos e de referência.

Recursos do Java ausente em C #

• A palavra-chave strictfp do Java garante que o resultado das operações de ponto flutuante permaneça o mesmo nas plataformas.

• Java suporta exceções verificadas para melhor aplicação da captura e tratamento de erros.


9

Outro bom recurso é http://www.javacamp.org/javavscsharp/ Este site enumera muitos exemplos que ilustram quase todas as diferenças entre essas duas linguagens de programação.

Sobre os atributos, o Java possui anotações, que funcionam quase da mesma maneira.


5

Genéricos:

Com os genéricos Java, na verdade, você não obtém a eficiência de execução obtida com o .NET porque, ao compilar uma classe genérica em Java, o compilador retira o parâmetro type e substitui Object em todos os lugares. Por exemplo, se você tem uma Foo<T>classe, o compilador java gera código de bytes como se fosseFoo<Object> . Isso significa que a transmissão e também o boxe / unboxing deverão ser realizados em "plano de fundo".

Eu jogo com Java / C # há algum tempo e, na minha opinião, a principal diferença no nível da linguagem é, como você apontou, delegados.


Isso está errado, a eliminação ou reificação de genéricos (Java e C # respectivamente) não afeta necessariamente o desempenho.
Miguel Ping

Você está confundindo autoboxing com casting.
JesperE

3
Não, bruno está certo sobre a diferença de desempenho. Não há como obter o equivalente a uma Lista <byte> (genericamente) em Java. Você precisaria ter uma lista <Byte> que incorreria em penalidades de boxe (tempo e memória).
Jon Skeet

O (des) boxe acontece apenas para os tipos em caixas, que são tipos primitivos.
Miguel Ping


0

Acesse o link fornecido abaixo msdn.microsoft.com/en-us/library/ms836794.aspx Abrange a semelhança e a diferença entre c # e java

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.