Quali sono le principali differenze tra C # e Java?


209

Voglio solo chiarire una cosa. Questa non è una domanda su quale sia il migliore, quella parte che lascio a qualcun altro per discutere. Non mi interessa. Mi è stata posta questa domanda durante il mio colloquio di lavoro e ho pensato che potesse essere utile imparare un po 'di più.

Questi sono quelli che ho potuto inventare:

  • Java è "indipendente dalla piattaforma". Bene, al giorno d'oggi potresti dire che esiste il progetto Mono , quindi anche C # potrebbe essere preso in considerazione, ma credo che sia un po 'esagerato. Perché? Bene, quando viene fatta una nuova versione di Java, questa è simultaneamente disponibile su tutte le piattaforme che supporta, d'altra parte quante funzioni di C # 3.0 mancano ancora nell'implementazione di Mono? O è davvero CLR vs. JRE che dovremmo confrontare qui?
  • Java non supporta eventi e delegati. Per quanto ne so.
  • In Java tutti i metodi sono virtuali
  • Strumenti di sviluppo: credo che non esista ancora uno strumento come Visual Studio. Soprattutto se hai lavorato con le edizioni di gruppo saprai cosa intendo.

Aggiungi altre persone che ritieni pertinenti.

Aggiornamento: Mi è appena venuto in mente, Java non ha qualcosa come attributi personalizzati su classi, metodi ecc. Oppure?


1
Le lingue sono diverse dalle implementazioni linguistiche, che sono anche diverse dalle biblioteche. Cosa stai cercando di confrontare?
Miguel Ping,


2
Ho trovato questo msdn.microsoft.com/en-us/library/ms836794.aspx Copre sia la somiglianza che la differenza tra C # e java.
Bipul,

1
Puoi ottenere molte delle cose menzionate di seguito su Java con le librerie giuste. Controlla ad esempio questo codice Java valido: new String [] {"james", "john", "john", "eddie"} .where (startWith ("j")). Distinto (); Usa una libreria chiamata lombok-pg. Può essere trovato su github.com/nicholas22/jpropel
NT_

Risposte:


329

Confronto tra Java 7 e C # 3

(Alcune funzionalità di Java 7 non sono menzionate qui, ma il usingvantaggio dell'istruzione di tutte le versioni di C # su Java 1-6 è stato rimosso.)

Non tutto il tuo riepilogo è corretto:

  • In Java i metodi sono virtuali per impostazione predefinita ma è possibile renderli definitivi. (In C # sono sigillati per impostazione predefinita, ma puoi renderli virtuali.)
  • Esistono molti IDE per Java, sia gratuiti (ad esempio Eclipse, Netbeans) che commerciali (ad esempio IntelliJ IDEA)

Oltre a ciò (e cosa c'è già nel tuo riepilogo):

  • I generici sono completamente diversi tra i due; I generici Java sono solo un "trucco" in fase di compilazione (ma utile in questo). In C # e .NET i generici vengono mantenuti anche al momento dell'esecuzione e funzionano per tipi di valore e tipi di riferimento, mantenendo l'efficienza appropriata (ad es. List<byte>Come byte[]supporto, anziché una matrice di byte inscatolati).
  • C # non ha verificato le eccezioni
  • Java non consente la creazione di tipi di valore definiti dall'utente
  • Java non ha un sovraccarico di operatore e conversione
  • Java non ha blocchi iteratori per una semplice implementazione degli iteratori
  • Java non ha niente come LINQ
  • In parte a causa della mancanza di delegati, Java non ha nulla di simile a metodi anonimi ed espressioni lambda. Le classi interne anonime di solito ricoprono questi ruoli, ma clunkily.
  • Java non ha alberi delle espressioni
  • C # non ha classi interne anonime
  • C # non ha affatto le classi interne di Java - tutte le classi nidificate in C # sono come le classi nidificate statiche di Java
  • Java non ha classi statiche (che non hanno alcun costruttori di istanza, e non può essere utilizzato per le variabili, i parametri ecc)
  • Java non ha equivalenti ai tipi anonimi C # 3.0
  • Java non ha variabili locali tipizzate in modo implicito
  • Java non ha metodi di estensione
  • Java non ha espressioni di inizializzatore di oggetti e raccolte
  • I modificatori di accesso sono in qualche modo diversi: in Java non esiste (attualmente) un equivalente diretto di un assembly, quindi non si ha idea della visibilità "interna"; in C # non esiste un equivalente della visibilità "predefinita" in Java che tenga conto dello spazio dei nomi (e dell'ereditarietà)
  • L'ordine di inizializzazione in Java e C # è leggermente diverso (C # esegue gli inizializzatori variabili prima della chiamata concatenata al costruttore del tipo di base)
  • Java non ha proprietà come parte del linguaggio; sono una convenzione dei metodi get / set / is
  • Java non ha l'equivalente del codice "non sicuro"
  • L'interoperabilità è più semplice in C # (e .NET in generale) rispetto al JNI di Java
  • Java e C # hanno idee leggermente diverse di enumerazioni. Java sono molto più orientati agli oggetti.
  • Java non ha direttive per il preprocessore (#define, #if ecc in C #).
  • Java non ha equivalenti di C # refe outper il passaggio di parametri per riferimento
  • Java non ha equivalenti di tipi parziali
  • Le interfacce C # non possono dichiarare i campi
  • Java non ha tipi interi senza segno
  • Java non ha il supporto linguistico per un tipo decimale. (java.math.BigDecimal fornisce qualcosa come System.Decimal - con differenze - ma non c'è supporto per la lingua)
  • Java non ha equivalenti di tipi di valori nullable
  • La boxe in Java utilizza tipi di riferimento predefiniti (ma "normali") con operazioni particolari su di essi. La boxe in C # e .NET è un affare più trasparente, con un tipo di riferimento creato per la boxe dal CLR per qualsiasi tipo di valore.

Questo non è esaustivo, ma copre tutto ciò a cui riesco a pensare fuori mano.


24
@Brian: Penso che i generici Java e i dettagli delle classi interne annullino abbastanza rapidamente l'idea che Java raggiunga la superiorità attraverso la semplicità;)
Jon Skeet,

8
@OrangeDog: le persone che discutono che si prendono per lo più scherzi, IMO. È difficile capire come essere costretti a scrivere un blocco try / finally esplicito sia meno soggetto a errori di un'istruzione using, IMO. La maggior parte delle funzionalità "extra" di C # rispetto a Java significa che puoi cavartela scrivendo meno codice e che quel codice può essere più leggibile.
Jon Skeet,

17
@OrangeDog: quanto sei imparziale, disinteressato? Sì, sono un appassionato di C #, ma con un'esperienza Java piuttosto significativa - dopo tutto è il mio lavoro quotidiano. Non è che io ignori come usare Java in modo efficace.
Jon Skeet,

8
@OrangeDog: Per cominciare, la maggior parte degli sviluppatori non scrive codice usando "non sicuro" per quanto ne so, quindi è un'aringa rossa. Penso anche che la provabilità sia un'aringa rossa: non credo che la provabilità formale abbia molto a che fare con quanto sia facile per un essere umano ragionare sul codice. Il mio punto è che, essendo piuttosto esperto in Java e C #, trovo C # un linguaggio di gran lunga superiore in termini di produttività e leggibilità. Se senti il ​​contrario, potresti chiarire i tuoi livelli di esperienza in entrambe le lingue? Penso che sia abbastanza rilevante per la discussione.
Jon Skeet,

21
@OrangeDog: Inoltre, la tua affermazione che "Essere in grado di fare più cose aumenta la probabilità che tu li sbagli" è anche un errore dell'IMO ... perché presume che se non riesci a fare qualcosa utilizzando una funzionalità del linguaggio che lo rende facile, non dovrai farlo affatto. È semplicemente falso: spesso le attività che devi eseguire in Java e C # sono le stesse, ma a causa delle caratteristiche mancanti, Java rende più difficile eseguire correttamente tali attività. Semplificando l'attività, la funzione riduce la probabilità che tu lo faccia in modo sbagliato.
Jon Skeet,

24

Quello che segue è un ottimo riferimento approfondito di Dare Obasanjo sulle differenze tra C # e Java. Mi trovo sempre a fare riferimento a questo articolo quando cambio tra i due.

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


2
@Jon Skeet: sei lo sviluppatore più attivo in C #. Perché non mantieni la tua versione di differenze C # e Java. Scommetto che alla gente piacerebbe leggerlo.
artigli il

1
@claws: Non ho tempo di fare tutto ciò che vorrei.
Jon Skeet,

19
@ Winston: abbiamo bisogno di una lista di "differenze tra Chuck Norris e Jon Skeet": 1) Chuck Norris ha sempre tempo; Jon deve modificare la TimeDateclasse per avere sempre tempo e non ha ancora avuto il tempo di farlo :(
RedFilter

11

C # ha proprietà automatiche che sono incredibilmente convenienti e aiutano anche a mantenere il codice più pulito, almeno quando non hai una logica personalizzata nei tuoi getter e setter.


10

Funzionalità di C # Assente in Java • C # include tipi più primitivi e funzionalità per rilevare eccezioni aritmetiche.

• Include un gran numero di vantaggi notazionali su Java, molti dei quali, come il sovraccarico dell'operatore e i cast definiti dall'utente, sono già familiari alla vasta comunità di programmatori C ++.

• La gestione degli eventi è un "cittadino di prima classe": fa parte della lingua stessa.

• Consente la definizione di "strutture", che sono simili alle classi ma che possono essere allocate nello stack (diversamente dalle istanze delle classi in C # e Java).

• C # implementa le proprietà come parte della sintassi del linguaggio.

• C # consente alle istruzioni switch di operare su stringhe.

• C # consente metodi anonimi che forniscono funzionalità di chiusura.

• C # consente l'iteratore che impiega le co-routine tramite una parola chiave di rendimento di tipo funzionale.

• C # supporta i parametri di output, favorendo la restituzione di più valori, una funzionalità condivisa da C ++ e SQL.

• C # ha la capacità di alias spazi dei nomi.

• C # ha "Implementazione esplicita dei membri" che consente a una classe di implementare in modo specifico metodi di un'interfaccia, separati dai propri metodi di classe. Ciò consente anche di implementare due diverse interfacce che hanno un metodo con lo stesso nome. I metodi di un'interfaccia non devono essere pubblici; possono essere resi accessibili solo tramite tale interfaccia.

• C # fornisce l'integrazione con COM.

• Seguendo l'esempio di C e C ++, C # consente la chiamata per riferimento per tipi primitivi e di riferimento.

Funzionalità di Java Absent in C #

• La parola chiave strictfp di Java garantisce che il risultato delle operazioni in virgola mobile rimanga lo stesso su tutte le piattaforme.

• Java supporta le eccezioni verificate per una migliore applicazione del trapping e della gestione degli errori.


9

Un'altra buona risorsa è http://www.javacamp.org/javavscsharp/ Questo sito elenca molti esempi che illustrano quasi tutte le differenze tra questi due linguaggi di programmazione.

Per quanto riguarda gli attributi, Java ha annotazioni, che funzionano quasi allo stesso modo.


5

Generics:

Con i generici Java, non si ottiene effettivamente l'efficienza di esecuzione che si ottiene con .NET perché quando si compila una classe generica in Java, il compilatore elimina il parametro type e sostituisce Object ovunque. Ad esempio, se si dispone di una Foo<T>classe, il compilatore java genera il codice byte come se fosseFoo<Object> . Ciò significa che il casting e anche il pugilato / unboxing dovranno essere eseguiti in "background".

Gioco con Java / C # da un po 'di tempo e, a mio avviso, le principali differenze a livello linguistico sono, come hai indicato, delegati.


Ciò è errato, la cancellazione o reificazione generici (rispettivamente Java e C #) non influisce necessariamente sulle prestazioni.
Miguel Ping,

Stai confondendo l'autoboxing con il casting.
JesperE,

3
No, bruno ha ragione sulla differenza di prestazioni. Non c'è modo di ottenere l'equivalente di un List <byte> (genericamente) in Java. Dovresti avere un Elenco <Byte> che comporterebbe penalità di boxe (tempo e memoria).
Jon Skeet,

Il (un) boxing si verifica solo per i tipi boxed, che sono tipi primitivi.
Miguel Ping,

1
Si prega di consultare questo articolo: jprl.com/Blog/archive/development/2007/Aug-31.html
bruno conde

0

Passare attraverso il collegamento indicato di seguito msdn.microsoft.com/en-us/library/ms836794.aspx Copre sia la somiglianza che la differenza tra C # e java

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.