Perché C # ha molte più funzioni di Java? [chiuso]


14

Si noti che questo non vuole essere un argomento Java vs. C #. Sono un programmatore Java senza esperienza in C #, chiedendo solo per curiosità.

Ho letto un po 'su C # e sembra che abbia molte più funzioni di Java. Numerosi esempi:

  • Tipo di inferenza.
  • dynamic parola chiave.
  • I delegati.
  • Parametri opzionali.
  • Lambda e LINQ (in realtà non ho idea di cosa siano).
  • Proprietà.

Tuttavia Java non presenta davvero nulla di ciò che C # non ha.

La mia domanda è: perché C # ha molte più funzionalità native rispetto a Java? E perché Java non ha aggiunto alcuni di questi nel corso degli anni, ad esempio Proprietà o tipo inferenza? I progettisti del linguaggio Java adottano un approccio più semplicistico? Qual è la ragione di ciò?


2
@Patrick - È una caratteristica o un dettaglio di implementazione?
Pete,

14
Risposta parziale: perché il team di progettazione di C # sa cosa sta facendo. Risposta più ragionevole: C # è stato progettato con la conoscenza dei fallimenti di Java e senza il dogmatico "solo OO puro" (che non hanno nemmeno colpito del tutto). La metà di queste funzionalità sono state importate in blocco da Lisp e Haskell, due lingue in cui Java ha rifiutato fermamente di essere ispirato fino a java 8, e le altre sono miglioramenti di sanità mentale resi palesemente ovvi dalla mancanza di Java.
Phoshi,

4
Perché C # è arrivato più tardi ed era inizialmente una palese fregatura di Java, e quindi ha avuto l'opportunità di aggiungere tutto ciò che è risultato utile, mentre Java è stato ostacolato da obiettivi di compatibilità con le versioni precedenti molto rigidi.
Kilian Foth,

2
@ Clockwork-Muse ma C # ha due implementazioni di runtime: CLR e Mono. Inoltre c'è Xamarin. Non ho sentito parlare di un'unica soluzione per la creazione di progetti cross iOS / Android / WinPhone utilizzando Java.
Den,

4
@KilianFoth: In realtà, C # inizialmente era un furto furtivo di Delphi , riscritto per assomigliare a Java. Microsoft ha persino portato l'architetto del progetto Delphi lontano da Borland per crearlo.
Mason Wheeler,

Risposte:


22

Diverse ragioni:

  1. C # è arrivato dopo Java; la versione 1 era una palese fregatura di Java 1.4, quindi praticamente aveva tutto ciò che Java aveva a quel punto.
  2. Ma poi C # si sviluppò molto più velocemente di Java, perché era una nuova piattaforma entusiasmante (e aveva un pilota assolutamente geniale in Anders Hejlsberg, il padre di Turbo Pascal). Ciò ha permesso loro di evitare tutti gli errori in Java che erano diventati evidenti, aggiungendo al contempo tutto ciò che i praticanti Java desideravano avere.
  3. Nel frattempo, Java è stata ostacolata da obiettivi di compatibilità con le versioni precedenti molto rigidi e da un ritmo di sviluppo un po 'più lento, in parte perché ha cercato disperatamente di guadagnarsi la reputazione di essere la soluzione standard, aziendale, affidabile e non sorprendente per il 95% dei non geniali programmatori. A questo ci sono riusciti, forse un po 'troppo bene.

Il risultato è che Java ora ha un po 'di spazio vuoto. Ha piani enormi per il futuro, ma come al solito con questo genere di cose tutto richiede un po 'più tempo del previsto.


7
Non sono sicuro di essere d'accordo. Voglio dire, è tutto vero, ma sospetto che la ragione abbia più a che fare con la politica intorno al collasso di Sun. In pratica, Java aveva più di 5 anni o meno in cui non c'erano organizzazioni / leadership, quindi non c'erano nuove funzionalità.
Telastyn,

7
C # 1 aveva tipi di valore. Qualcosa che Java non avrà mai. Quindi non solo una "palese fregatura".
Den,

1
@Telastyn - Penso che questo sia il motivo più importante qui. Soprattutto quando aggiungi "e poi vieni acquisito dall'oracolo" alla fine del collasso del Sole.
Wyatt Barnett,

7
Accetto con @Den. Penso che il motivo principale per lo sviluppo più veloce di C # (e nella giusta direzione) sia la leadership di Anders Hejlsberg. Lui e il suo team hanno aggiunto le migliori funzionalità di altre lingue e sono riusciti a integrarle perfettamente in C #. Il risultato è che C # ha caratteristiche del linguaggio molto pulite senza sentirsi confuse o disordinate.
David Kirkland,

1
@WesleyWiser - aggiornato a "potrebbe avere in futuro".
Den

4

Aggiungerei alla risposta di Kilian che una grande differenza tra Java e C # è che i progettisti di C # controllano non solo il linguaggio, ma anche l'IDE standard.

Aggiungere qualcosa come metodi di estensione e classi parziali potrebbe essere un incubo nel controllo delle versioni di sviluppo / controllo se gli IDE non lo supportassero correttamente.

Dal momento che dovresti essere in grado di compilare Java con la tua piattaforma preferita (Eclipse, Netbeans, vi + Ant), aggiungere funzionalità che infrangono il codice (e usarle per sviluppare estensioni aggiuntive come LINQ) è molto più complicato del semplice dire " poiché IntelliSense si occuperà di questi casi, non dobbiamo preoccuparci ".

Inoltre, a volte vale la pena notare il valore delle funzionalità anziché il suo numero. Ad esempio, le proprietà automatiche sono buone e certamente vorrei che Java lo supportasse, ma alla fine significa solo che devi scrivere qualche altra riga di codice in Java. Allo stesso modo, trovo che chiamare "Eventi" una caratteristica sia in qualche modo un termine improprio, dal momento che sono poco più che delegati appositamente etichettati, e solo una copia raffinata del modello Observer già utilizzato da Java (quindi, di nuovo, in Java ha bisogno di più esplicito codifica)

Non fraintendetemi, penso che C # abbia introdotto diverse innovazioni degne di nota e vorrei che un giorno i grandi capi Oracle si svegliassero e lanciassero un vero "Java 2" per includerne alcuni, ma il divario non è così ovvio come il vostro punti di domanda.


2
Le nove righe necessarie per una semplice definizione di proprietà (dichiarazione + get / set + spazio bianco) si sommano rapidamente a più di "poche".
Kevin Cline,

@kevincline e anche io documentiamo correttamente sia setter che getter. Ma alla fine, anche se non sto usando la mia generazione automatica di codice IDE per l'accessor, non sto usando alcun notevole periodo di tempo con questi, quando si tiene conto del tempo speso in logica aziendale, test, progettazione del codice (in effetti Sto pensando principalmente a questi anche quando si digitano gli accessori). Quindi, sebbene bello, non è qualcosa che alla fine fa una grande differenza ...
SJuan76

3
Non è il momento di scriverli. È il momento di leggerli e ignorarli, ancora e ancora e ancora e ancora, mentre sei sulla buona strada per le parti interessanti.
Kevin Cline,

@kevincline Sono d'accordo, è più leggibile e il codice è pulito. Questo è il motivo per cui apprezzo cose come Eventi, che sono solo un modello di osservatore incorporato, ma rendono le cose molto più pulite se dovessi scriverle tu stesso
Aviv Cohn,

@AvivCohn Il fatto è che "integrato" è la parte fondamentale. Puoi avere un invio dinamico nell'assemblaggio, puoi avere funzioni di ordine superiore in C, ogni caratteristica linguistica che puoi avere è possibile nell'assemblaggio - ovviamente, poiché ad un certo punto, funziona ancora sulla tua CPU x86. Raramente è necessario implementare il modello Command in C #, perché si dispone di delegati. Lo stesso con Observer ed eventi, e molti altri. Java aveva metodi anonimi per qualche tempo, ma dovevi creare un tipo completamente anonimo . Tutte queste cose sono minuscole, ma si sommano.
Luaan,
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.