Per quali motivi dovrei scegliere C # su Java e C ++? [chiuso]


46

C # sembra essere popolare in questi giorni. Ho sentito che sintatticamente è quasi lo stesso di Java. Java e C ++ esistono da più tempo. Per quali motivi dovrei scegliere C # su Java e C ++?


16
Come scritto la domanda era un esempio da manuale di non costruttivo "quale lingua è migliore?" domande fuori tema qui. Ho cercato di renderlo più costruttivo con una modifica poiché in realtà ha ottenuto risposte valide e ben ponderate. Tuttavia, tieni a mente le domande frequenti e questo post sul blog quando fai domande di questo tipo.
Adam Lear

Consentitemi di aggiungere alcuni elementi di tendenza. .NET ha un DOM ben definito ( ad es. CodeDOM ) per il suo linguaggio e di conseguenza generare cose dinamicamente in fase di esecuzione è molto più semplice ed efficiente. Questo può anche essere utile come capacità infrastrutturale. Inoltre, il sistema dei tipi ha una corrispondenza da 1 a 1 con tutti i tipi W3 nativi. Alla base, W3 e altri interoper sono stati inseriti nella lingua sin dall'inizio. Per altre lingue queste preoccupazioni sono state semplicemente accantonate e presentano molte sfide per loro. Inoltre, se interagirai con molte lingue e / o protocolli, anche .NET è molto potente
JoeGeeky,

5
Ehi, JoeGeeky, aggiungi il tuo commento come risposta alla domanda.
Anthony Mastrean,

1
La vera domanda è: per quali motivi dovrei scegliere Nemerle, F * e F # su C #? (vale a dire, tutte e tre le lingue provengono dalla SM e tutte e tre sono migliori)
martedì

Non credo davvero che nessuna affermazione del genere "lingua / piattaforma X rispetto a lingua / piattaforma Y è SEMPRE migliore" è valida e penso anche che per qualsiasi X e Y possa essere facilmente invalidata per determinati contesti. Qual è il punto di questa domanda?
Drago di Shivan,

Risposte:


76

La domanda dovrebbe essere "Quale lingua è più adatta allo sviluppo di applicazioni moderne e tipiche?".

Modifica: ho affrontato alcuni dei commenti qui sotto. Una piccola osservazione: considera che quando hai molte cose in modo nativo, come idiomi, è una grande differenza rispetto all'implementazione o al download e all'uso da soli ogni volta. Quasi tutto può essere implementato in una di queste lingue. La domanda è: cosa ti offrono le lingue in modo nativo.

Quindi, in cima alla mia testa (alcuni argomenti si applicano ad entrambe le lingue) ...

C # è meglio di C ++ in quanto:

  • Ha una raccolta dei rifiuti nativa .
  • Ti permette di trattare le firme dei metodi di classe come funzioni libere (cioè ignorando l' thisargomento del puntatore tipizzato staticamente ) e quindi creare relazioni più dinamiche e flessibili tra le classi. modifica se non sai cosa significa, quindi prova ad assegnare un metodo membro che restituisce void e accetta void a una void (*ptr)()variabile. I delegati C # portano thiscon sé il puntatore, ma l'utente non deve sempre preoccuparsene. Possono semplicemente assegnare un void()metodo di qualsiasi classe a qualsiasi altro void()delegato.
  • Ha un'enorme libreria standard con così tante cose utili che è ben implementato e facile da usare.
  • Consente blocchi di codice sia gestiti che nativi.
  • Il controllo delle versioni dell'assembly risolve facilmente i problemi dell'inferno DLL.
  • È possibile impostare classi, metodi e campi interni all'assembly (il che significa che sono accessibili da qualsiasi punto della DLL in cui sono dichiarati, ma non da altri assembly).

C # è meglio di Java in quanto:

  • Invece di un sacco di rumore (EJB, implementazioni di classi statiche private, ecc.) Ottieni costrutti nativi eleganti e amichevoli come Proprietà ed Eventi.
  • Hai dei veri generici (non il brutto scherzo del casting che Java chiama generici) e puoi fare delle riflessioni su di essi.
  • Supporta idiomi nativi di gestione delle risorse (la usingdichiarazione). Anche Java 7 lo supporterà, ma C # lo ha avuto per molto tempo.
  • Non ha verificato le eccezioni :) (discutibile se questo è buono o cattivo)
  • È profondamente integrato con Windows, se è quello che vuoi.
  • Ha Lambdas e LINQ, quindi supporta una piccola quantità di programmazione funzionale.
  • Consente esplicitamente sia la covarianza generica che la contravarianza.
  • Ha variabili dinamiche, se le vuoi.
  • Migliore supporto di enumerazione, con la yielddichiarazione.
  • Ti consente di definire nuovi tipi di valore (o non di riferimento).

Modifica: indirizzare i commenti

  • Non ho detto che C ++ non supporta RAII nativo. Ho detto che Java non ce l'ha (devi fare esplicitamente un tentativo / finalmente). C ++ ha puntatori automatici che sono ottimi per RAII e (se sai cosa stai facendo) possono anche sostituire la garbage collection.
  • Non ho detto nulla sull'emulazione di funzioni gratuite. Ad esempio, se è necessario accedere a un campo tramite un thispuntatore e associare il metodo che lo fa a un puntatore a funzione generica (cioè non nella stessa classe), semplicemente non esiste un modo nativo per farlo. In C #, ottieni gratuitamente. Non devi nemmeno sapere come funziona.
  • "Trattando i metodi membri come funzioni libere" intendevo dire che non è possibile, ad esempio, associare nativamente un metodo membro a una firma di funzione libera, poiché il metodo membro "segretamente" ha bisogno del thispuntatore.
  • La usingdichiarazione, ovviamente insieme ai wrapper IDisposable, è un ottimo esempio di RAII. Vedere questo link . Considera che non hai bisogno di RAII tanto in C # come in C ++, perché hai il GC. Per i periodi specifici in cui ne hai bisogno, puoi utilizzare esplicitamente la usingdichiarazione. Un altro piccolo promemoria: liberare memoria è una procedura costosa. GC ha il vantaggio in termini di prestazioni in molti casi (specialmente quando si ha molta memoria). La memoria non perderà e non passerai molto tempo a deallocare. Inoltre, anche l'allocazione è più veloce, poiché non si alloca memoria ogni volta, solo una volta ogni tanto. La chiamata newsta semplicemente incrementando un puntatore all'ultimo oggetto.
  • "C # è peggio in quanto ha la raccolta dei rifiuti". Questo è davvero soggettivo, ma come ho affermato all'inizio, per lo sviluppo di applicazioni tipiche e moderne, la garbage collection rappresenta un vantaggio enorme.
    In C ++, puoi scegliere di gestire manualmente la tua memoria usando newe delete, che empiricamente porta sempre a errori qua e là, oppure (con C ++ 11) puoi usare i puntatori automatici in modo nativo, ma tieni presente che aggiungono molti di rumore al codice. Quindi GC ha ancora un vantaggio lì.
  • "I generici sono molto più deboli dei modelli" - Non so da dove l'hai preso. I modelli potrebbero avere i loro vantaggi, ma nella mia esperienza i vincoli, il controllo generico dei parametri, la contravarianza e la covarianza sono strumenti molto più forti ed eleganti. Il punto di forza dei template è che ti permettono di giocare un po 'con la lingua, il che potrebbe essere interessante, ma provoca anche molti mal di testa quando vuoi eseguire il debug di qualcosa. Quindi, tutto sommato, i modelli hanno le loro belle caratteristiche, ma trovo i generici più pratici e puliti.

5
E se vuoi ancora un Garbage Collector per C ++, puoi scaricarne uno .
Fredoverflow il


6
Un'altra caratteristica importante in C # rispetto a Java, per motivi di prestazioni, è lo "struct", un tipo di oggetto che può essere memorizzato nello stack (o nei registri della CPU, in casi speciali) o incorporato in altri oggetti heap. Sono spesso usati per piccoli oggetti con 1-4 campi, come le coppie di coordinate X, Y.
Qwertie,

2
@LokiAstari Ti stai spiegando? Se ricordi di annullare la registrazione dei gestori di eventi e di utilizzare il modello Dispose su classi che contengono wrapper nativi, andrà tutto bene. È molto meno da sapere e ricordare della gestione della memoria in C ++.
Yam Marcovic,

2
-1 poiché mi mancano le sezioni "C ++ è meglio di C # in questo ..." e "Java è migliore di C # ...". Non credo che C # sia superiore in tutte le aree, quindi una risposta senza queste due sezioni è probabilmente priva di alcune informazioni importanti.
Giorgio,

30

L'ambiente

Client .NET Framework e Windows

Windows è il sistema operativo dominante sui computer client. I migliori framework GUI per applicazioni Windows sono Winforms e WPF insieme a .NET Framework . Il miglior linguaggio di programmazione per lavorare con .NET Framework e le sue API è C # . Java non è un'alternativa per questo. E C ++ è un linguaggio più vecchio senza gestione automatica della memoria. C # è simile a C ++ ma ha una gestione automatica della memoria e non devi lavorare con i puntatori, il che ti rende più produttivo. Il C ++ può ancora essere la migliore opzione per alcuni casi, ma non per le applicazioni di database ad alta intensità di modulo che sono comuni nel mondo degli affari.

IIS e Windows Server

Se sei abituato a lavorare in ambiente Windows e con C #, avrai bisogno del minimo investimento per imparare IIS per la programmazione del server e Windows Server per l'amministrazione di base.

Active Directory e Windows Server

Se si sta sviluppando un software che verrà distribuito nelle reti aziendali, è probabile che utilizzino un ambiente centrato su Windows utilizzando un Windows Server con Active Directory. In tale ambiente è più semplice integrare e distribuire una soluzione realizzata in C # e .NET Framework .

Personalmente, sono uno sviluppatore Java, non uno sviluppatore C #, ma lavoro con il web. Passerei a C # se stavo sviluppando applicazioni di rete per la rete Windows. Ma preferisco i server Web basati su Java per Linux. Sceglierei C ++ per i sistemi embedded se non avessi molte dipendenze.

Sì, C # è un linguaggio migliore con funzionalità più moderne rispetto a C ++ e Java, ma non è la cosa più importante per scegliere C # .

Sommario

L'ambiente per il tuo software è molto importante per scegliere C # . Se si lavora in un ambiente con client Windows, server Windows, Active Directory, IIS e forse di SQL Server , allora C # è il linguaggio di gran lunga meglio con il .NET Framework .

Se lavori in un ambiente Unix con ad esempio servizi web, Java sarebbe la mia scelta. E se lavori con sistemi embedded o devi integrarti con dispositivi hardware, C ++ sarebbe una buona scelta.


3
Assolutamente - questo è il motivo per cui uso C # non proprio per nessun altro motivo
Murph

Puoi certamente usare .NET su altre piattaforme tramite Mono, MonoTouch e MonoDroid, ma i miei benchmark hanno riscontrato che Mono è significativamente più lento di .NET per Windows e il Compact Framework di Microsoft è estremamente lento su Windows CE: codeproject.com/KB/cross -platform / BenchmarkCppVsDotNet.aspx ... ovviamente, WPF è disponibile solo su Windows (ma non mi piace comunque.)
Qwertie,

Quali dipendenze vuoi dire che "sceglierei C ++ per i sistemi embedded se non avessi molte dipendenze". Intendi le librerie Java?
Puckl,

@Puckl sì, ma soprattutto jvm / jre.
Jonas,

"Se si lavora in un ambiente Unix con i servizi Web per esempio" ci sono alcune altre lingue e quadri che potrebbero essere considerate: Ruby, Python, ecc node.js
MarkJ

15

C # e Java

C # è un linguaggio molto valido se:

  • Vuoi fare uno sviluppo orientato agli oggetti per scopi generici. È un linguaggio OOP classico, tipicamente statico.
  • Stai prendendo di mira solo piattaforme Microsoft (vale la pena ricordare che Microsoft ha clonato efficacemente Java per creare C # perché voleva un linguaggio simile a Java che avrebbe bloccato le persone in Windows. Avrebbero potuto usare Java, ma ciò avrebbe permesso alle persone di eseguire facilmente applicazioni su altre piattaforme ....)

C # come linguaggio è più bello di Java in vari modi (migliore sintassi per proprietà, tipi di valore, generici reificati ecc.). Preferisco C # come linguaggio rispetto a Java ma nel grande schema delle cose sono linguaggi abbastanza simili e adatti per applicazioni simili.

D'altra parte, Java ha anche alcuni grandi vantaggi:

  • Enorme ecosistema open source: le librerie per Java che puoi ottenere gratuitamente sono di gran lunga le migliori di qualsiasi lingua. È difficile sopravvalutare l'importanza di questo - dal punto di fare le cose, Java è molto efficace.
  • Strumenti: a mio avviso gli strumenti Java sono migliori di quelli che puoi ottenere nel mondo .Net. ad esempio Maven (una volta che l'hai imparato!) è particolarmente impressionante.
  • Manutenibilità - Java esiste da un po 'di tempo ed ha avuto successo nelle grandi aziende proprio perché è relativamente stabile e ci sono stati molti sforzi nella retrocompatibilità. La sintassi semplice e leggermente dettagliata aiuta anche Java qui: è più facile leggere e mantenere il codice se il codice è molto chiaro ed esplicito.
  • Nuove lingue: JVM ha alcune nuove fantastiche lingue (Scala, Clojure, Groovy ecc.) Che rappresentano il futuro della piattaforma Java. È qui che sta avvenendo gran parte dell'innovazione del linguaggio e sta accadendo molto più velocemente rispetto a Java o C #.

Quindi Java vs. C # è una chiamata piuttosto ravvicinata e dipende davvero dal fatto che tu voglia essere nel campo Microsoft o nel campo Open Source / multipiattaforma.

Personalmente, preferisco Java perché:

  • L'ecosistema della libreria è a mio avviso molto più importante del fatto che C # abbia una sintassi migliore di Java
  • A lungo termine, voglio che tutto il mio codice sia correttamente multipiattaforma e in grado di funzionare su grandi cluster di macchine Linux economiche sul cloud.
  • Clojure è l'IMHO la lingua più promettente al mondo in questo momento, e se rimango con la piattaforma JVM sarò in grado di trasferire facilmente il mio codice e le mie abilità in Clojure nel tempo.

C / C ++

C / C ++ è sostanzialmente una bestia completamente diversa. Vorrei non consiglio per lo sviluppo di applicazioni di uso generale al giorno d'oggi per i seguenti motivi:

  • Gestione della memoria - al giorno d'oggi per la programmazione per scopi più generali, non si desidera gestire la propria memoria. La garbage collection in C # o Java è molto migliore per la tua produttività e sanità mentale rispetto a qualsiasi delle tecniche di gestione della memoria esplicita che dovrai usare in C / C ++
  • Complessità - Il C ++ in particolare è un linguaggio estremamente complesso. Ci vuole molto tempo per padroneggiare e anche il codice stesso può essere diabolicamente complesso. (I modelli C ++ per esempio sono particolarmente pelosi ....)
  • Produttività: la maggior parte delle volte, a parità di condizioni, impiegherà più tempo a fare le cose in C / C ++.

Tuttavia è senza dubbio un'ottima scelta in un certo numero limitato di domini speciali, in particolare:

  • Sistemi operativi: probabilmente si desidera utilizzare C / C ++ se si sta scrivendo un sistema operativo.
  • Sviluppo di giochi - quasi tutti i migliori motori di gioco commerciali sono C / C ++. È ancora la scelta migliore se stai sviluppando un titolo AAA impegnativo (C # e Java sono perfetti per i giochi meno impegnativi / casual)
  • Elaborazione ad alte prestazioni - C / C ++ ottimizzato è probabilmente il modo migliore per creare codice ad alte prestazioni. Per la maggior parte delle applicazioni che fanno questo livello di ottimizzazione non vale la pena, ma in alcuni domini può essere estremamente prezioso (ad esempio il trading ad alta frequenza)
  • Accesso all'hardware: è necessario l'accesso diretto all'hardware (ad es. Per un sistema incorporato)

Quindi, in sostanza, C / C ++ è un'ottima scelta se e solo se ti concentri su uno dei domini in cui è particolarmente adatto.


1
Citi Maven come esempio di strumenti migliori per Java. Non ne sono particolarmente familiare, ma guardando la documentazione, Maven sembra piuttosto simile allo strumento di creazione nativo .Net MSBuild. Cosa rende Maven migliore di MSBuild?
Kevin Cathcart,

1
+! (solo perché ho un solo voto): hai spiegato molto bene perché l'ecosistema Java è migliore e perché non si dovrebbe confrontare solo la sintassi di C # vs Java. Java ha più e migliori librerie e strumenti. Non sta accadendo molto nel linguaggio Java stesso, ma per la JVM stanno comparendo nuovi linguaggi molto interessanti che sono (IMO) molto più interessanti di C #. Non conosco Clojure ma trovo la Scala molto interessante: progettata per essere OOP + FP sin dall'inizio.
Giorgio,

2
perché tutti pensano che il codice C ++ sia pieno di gestione manuale della memoria. Non è C, sai, RAII significa che non devi quasi mai allocare / liberare memoria manualmente (i tempi che fai sono quelli in cui un linguaggio come C # ti sarebbe inutile).
gbjbaanb,

3
@gbjbaanb - probabilmente perché RAII non è adeguato per la gestione della memoria per scopi generici. Non è in alcun modo equivalente in termini di flessibilità a un sistema GC completo come si vede in Java o C #. Non appena oltrepassi i limiti di RAII, torni nel territorio della gestione manuale della memoria.
Mikera,

3
@mikera Voglio solo sottolineare che c'è anche un po 'di sviluppo del linguaggio anche sulla piattaforma .NET. Ad esempio, F # è un linguaggio funzionale pulito che integra perfettamente il resto di .NET e Python è stato recentemente portato su .NET come Iron Python (e ha ottenuto anche un IDE piacevole !).
ikh,

13
I heard that syntactically they are almost the same.

Sintatticamente? Chi dà scimmie volanti sulla sintassi? La sintassi è utile solo per una cosa: consentire una migrazione più rapida da linguaggi sintatticamente simili. Questo è tutto.

C # è di gran lunga migliore di Java. Considera il loro supporto per la programmazione generica e funzionale: C # è molto più avanti di Java. Per non parlare dei sovraccarichi dell'operatore e di altre cose buone: C # è di gran lunga migliore. Non è possibile che Java possa essere considerato migliore di C #.

C ++ e C # è più di un concorso. Il C ++ ha un modello di compilazione arcaica incredibilmente fastidioso e un sacco di malattie ereditarie da C, ma i suoi modelli sono enormemente più potenti dei generici, e i suoi approcci di gestione delle risorse sono molto più flessibili e potenti in generale, così come usingun fallimento completo, ed esegue Più veloce.


6
Penso che si dovrebbero confrontare sia le funzionalità linguistiche che la disponibilità di una lingua su piattaforme diverse. Con C # one è bloccato con Microsoft, con Java uno no: questo è un grande vantaggio, almeno per gli sviluppatori UNIX / Linux. OOP + FP sono funzioni interessanti ma perché preoccuparsi di C # se puoi usare Scala, che gira su JVM e può interfacciarsi con il codice Java legacy? Non imparerei mai una lingua specifica della piattaforma se non sono costretto a farlo.
Giorgio,

2
@Giorgio: il progetto Mono esiste. Ma in secondo luogo, Microsoft si prende davvero cura della propria piattaforma, gli danno regolarmente grandi aggiornamenti. Java non ha quasi avuto nulla di nuovo. Inoltre, la domanda riguarda C # vs Java, non CLR vs JVM.
DeadMG

4
@DeadMG: Per quanto ne so non posso prendere nessun programma C # sviluppato su Windows e costruirlo con Mono. Non CLR vs JVM? La domanda è perché le persone usano C # o Java. Perché le persone usino una lingua hanno bisogno di un runtime e di un sistema operativo. Non discuto del fatto che C # abbia più funzionalità di Java, ma Java è molto più portatile: questo è un fattore che può influenzare l'adozione di un linguaggio. In effetti Java è ancora usato molto più spesso di C # anche se manca di alcune funzionalità avanzate.
Giorgio,

3
@Giorgio, puoi prendere qualsiasi programma C # e costruirlo con Mono. Non è possibile utilizzare determinate librerie (che comunque non fanno parte del linguaggio C #). E java non è "molto più portatile". Puoi codificare per iOS in C #, ma non in Java, ad esempio.
SK-logic,

2
@Giogio, Mono è almeno portatile come JVM.
SK-logic,

7

Bene C#ha alcune belle funzioni integrate come LINQe delegati. Sta ottenendo il meglio da entrambi i mondi - Javae C++. Guarda qui per un confronto completo.

Ma il Javamondo mi piace di più: molto più framework open source e funziona su ogni piattaforma. E non parlarmene Mono, non è un'opzione affidabile.


9
+1: "Ma mi piace di più il mondo Java: molto più framework open source e funziona su ogni piattaforma." Speriamo che Oracle non cambi questo!
Giorgio,

15
Ti dispiace spiegare, cosa non è "affidabile" in Mono?
SK-logic,

2
@Petar Minchev, non è altro che colpa tua. È necessario seguire le linee guida per la portabilità e non utilizzare librerie non portatili e in questo modo qualsiasi applicazione complessa funzionerebbe in modo affidabile con Mono. Cose come WPF non verranno mai trasferite.
SK-logic,

2
@Petar Minchev, ci sono molte librerie Java non portatili là fuori. Devi essere sempre cauto sulla portabilità, indipendentemente dalla lingua che stai utilizzando. E comunque, la domanda riguarda le lingue, non le librerie di terze parti.
SK-logic,

3
@Petar Minchev, GTK # è portatile. Usalo invece.
SK-logic,

3

Secondo alcune fonti (vedi ad esempio http://www.indeed.com/jobtrends ) C # è ancora meno popolare di Java e popolare come C ++.

C # fornisce funzionalità che mancano a Java, ad esempio il supporto diretto per alcuni modi di dire di programmazione come proprietà, stile di programmazione funzionale e così via. C # ha un livello di astrazione più elevato rispetto a C ++, il che è un vantaggio quando i tempi di sviluppo sono più importanti della velocità del programma.

Personalmente, preferisco ancora i mondi Java / C ++. Come ha detto Petar Minchev, Java ha più framework e applicazioni open source, funziona ovunque, è meno legato a un particolare fornitore e sistema operativo. Il C ++ ha vantaggi simili, anche se il codice spesso necessita di adattamenti che vanno da una piattaforma all'altra. Dato che preferisco sviluppare su Linux e, per quanto ne so, non posso avere pienamente sviluppato C # su Linux, non ho mai avuto un vero interesse per C # perché le mie esigenze di programmazione sono coperte da C, C ++, Java, Scala.

D'altra parte, per molti sviluppatori essere legati a un particolare fornitore non è un problema: Microsoft ha una posizione dominante nel mercato dei sistemi operativi e C # offre molte opportunità di lavoro. Pertanto, molti sviluppatori IMO adottano C # perché, oltre ad essere un linguaggio ricco di funzionalità, è anche un buon investimento.


"Non posso avere pienamente sviluppato C # su Linux" - Potresti approfondire questo? Vuoi dire che il framework .Net completo non è disponibile perché non ho riscontrato problemi con il linguaggio C # stesso (o F # del resto) su Linux?
Wesley Wiser,

@wawa: Per quanto ne so, il framework .Net corrisponde al JDK e il framework .Net è disponibile solo per Windows mentre il JDK è disponibile per diversi sistemi operativi. Se ciò non è corretto, posso modificare la mia risposta (e anche cambiare la mia opinione).
Giorgio,

1
Penso che un'analogia più stretta sarebbe la Libreria di classi base al JDK. Il BCL ha parti standardizzate e non standardizzate. Il progetto mono implementa sia i pezzi standardizzati che quelli non standardizzati.
Wesley Wiser,

@wawa: grazie per l'informazione. Sto pensando di provare C # con Mono. Tuttavia, ho ancora la sensazione abbastanza forte che C # sia molto più fortemente legato a Microsoft di quanto Java sia a Oracle (o a Sun in passato).
Giorgio,

3

Che dire di "Quale Framework di sviluppo software, che include un linguaggio di programmazione", è meglio?

Hai dimenticato di includere altre cose, come "l'ambiente" con cui lavorerai.

  1. Lavorerai solo per il sistema operativo Windows, ma non deve essere di basso livello e avere molta memoria e altre risorse?

    Scegli .NET come framework su Windows e usa C #.

  2. Lavorerai solo per Windows, ma non deve essere di basso livello, MA non ha molte risorse?

    Scegli il Delphi Framework (e il linguaggio di programmazione Object Pascal Delphi o il linguaggio di programmazione Lazarus Object Pascal)

  3. È la tua app. richiesto di supportare diverse piattaforme, come un gioco, in diversi cellulari?

    Scegli Java Framework e il linguaggio di programmazione Java.

  4. È Linux con KDE come interfaccia grafica?

    Scegli QT framework, con C ++

  5. È Linux con Gnome come interfaccia grafica?

    Scegli il framework GObject / GLib, con C ++

  6. Lavorerai con molte operazioni di basso livello, come lo sviluppo di driver?

    Plain C o C ++ è usato per diversi sistemi operativi, con librerie standard, come framework.

Solo i miei 2 centesimi.


1
Non ne sono sicuro 3. Gli smartphone sono molto popolari oggi e AFAIK, tutti supportano C # in qualche modo, ma solo Android supporta Java.
svick,

Delphi non è morto? :)
šljaker, il

@ šljaker No, ma non è molto popolare in questi giorni.
Umlcat,

1
@svick: è una bugia. Oltre ad Android, Java esiste anche in qualche modo su iOS, Symbian, WinMo, Blackberry, Maemo e WebOS (vale a dire tutto ciò che conta o che conta ancora; non iniziare con piattaforme ancora più piccole). Android, Blackberry e Symbian supportano ufficialmente Java come opzione di sviluppo; Sun era solito supportare Java su iOS anche se Apple non lo immaginava. Java è il linguaggio di sviluppo principale nei telefoni Android e Blackberry. Non posso dire lo stesso con C #, AFAICT è ufficialmente supportato solo su WinMo.
Lie Ryan,

1

Se fai una ricerca, probabilmente incapperai in una discussione sui principali linguaggi di programmazione. Ecco uno dei risultati della ricerca - http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - Java sembra essere ancora la lingua più popolare.

Java ha cercato di eliminare alcune delle carenze di C ++ (e di semplificare la vita dei programmatori per applicazioni non in tempo reale e non critiche). Essendo C-ritardatario della festa, C # ha evitato alcune carenze del linguaggio Java. C # ha fatto molti progressi (poiché Microsoft ha molto controllo su di esso) mentre i progressi in Java sono stati bloccati per un considerevole periodo di tempo a causa di conflitti tra le parti interessate.


1

Un paio di cose che non sono già state menzionate:

C # è meglio di C ++ perché:

Elimina i file di intestazione, il che si traduce in grande semplicità.

C # è meglio di Java perché:

Supporta tipi definiti dall'utente (di classe di riferimento) e di tipo di valore (struct) definiti dall'utente, che, se si sa cosa si sta facendo, può offrire significativi vantaggi in termini di prestazioni.

Supporta i delegati, che sono come interfacce a metodo singolo, semplificando così notevolmente la codifica di costrutti che si verificano frequentemente che coinvolgono oggetti a metodo singolo.


Puoi spiegarci in che modo avere sia il tipo di riferimento che il tipo di valore può portare vantaggi in termini di prestazioni in C #?
Giorgio

Ad esempio, se si desidera disporre di una matrice di record, in Java non si ha altra scelta che descrivere il proprio record utilizzando una classe, quindi la propria matrice sarà una matrice di riferimenti a una moltitudine di oggetti allocati separatamente. In C # puoi descrivere il tuo record usando una struttura, quindi il tuo array sarà solo una singola area continua di memoria contenente le tue strutture una dopo l'altra, proprio come in C.
Mike Nakis

Come altro esempio, se si desidera definire un nuovo nuovo tipo, (un tipo che si adatterebbe all'interno di una parola macchina), non è necessario definire una nuova classe per esso; puoi semplicemente renderlo una struttura, quindi obbedirà alla semantica del valore. Passare tali strutture in giro non sarà più costoso che passare attorno ai riferimenti agli oggetti, ma avrai il vantaggio di non allocare, costruire e raccogliere immondizia qualsiasi oggetto.
Mike Nakis,

Capisco. Quindi le classi vengono istanziate sull'heap e accessibili tramite riferimenti mentre le strutture sono istanziate sullo stack (?)
Giorgio

Quasi corretto L'unica inesattezza in questa affermazione è che una struttura sarà trovata sull'heap se è incorporata in un altro oggetto o se è all'interno di una matrice di strutture. E verrà anche trovato nell'heap se mai viene inscatolato, esattamente come i tipi di valore vengono inscatolati in Java.
Mike Nakis,

1

Dovresti scegliere la lingua migliore per il tuo ambiente previsto e la tua esperienza.

Scegli C # se lavori in un ambiente solo Microsoft. Mentre C # è standardizzato secondo ISO / IEC 23270: 2003, la versione di Microsoft rimane l'unica implementazione completa. Diverse parti chiave del linguaggio non sono coperte dallo standard e sono quindi soggette ai brevetti di Microsoft. Nessun altro implementerà una versione completamente compatibile della lingua per altri sistemi, quindi, in effetti, sei un fornitore bloccato su Microsoft Windows e .Net fintanto che usi la lingua. Se stai cercando competenze da utilizzare nel mercato mobile, è meglio cercare un'altra lingua.

Java funziona, ma ha un sacco di sovraccarico, in parte a causa di funzionalità come la garbage collection. Anche Java non è standardizzato da ISO / IEC, quindi non hai garanzie se cambi piattaforme e versioni di Java, solo le migliori intenzioni di Sun / Oracle. Se stai pianificando di lavorare con Android, questa è sicuramente la strada da percorrere. La programmazione di Android è sostanzialmente Java, con alcune modifiche.

Il C ++ è standardizzato e quasi tutti i compilatori seguono lo standard internazionale, quindi hai un comportamento garantito MA il linguaggio non ti protegge da te stesso. Devi eseguire il controllo di pulizia e overflow da solo. Questo non è difficile. I programmatori C / C ++ lo fanno da molti anni. Apple usa l'obiettivo C per tutto, quindi se vuoi mirare ad Apple, ti consiglio di provare questo.

Se ti vedi a lasciare Windows a un certo punto, ti suggerisco di imparare sia C / C ++ che Java, entrambi attualmente commercializzabili.


0

In relazione a C ++ vs C # (dato che non sono abbastanza esperto in Java), ciò che mi manca qui è la possibilità di accedere a cose di basso livello su Windows. Ad esempio, non è possibile sviluppare un driver di visualizzazione nativo in C # (ancora), ma è possibile con C ++. Ciò non migliora il C ++. Vedo C ++ contro C # come Assembly contro C.

A mio avviso, C # è molto più efficiente se si considera il tempo necessario per implementare effettivamente una funzione. La penalità prestazionale del runtime .Net è trascurabile per il 99% delle applicazioni sviluppate. Può essere importante se stai eseguendo un ciclo stretto, sì in ogni caso, ma la maggior parte delle volte un'applicazione è inattiva, in attesa di qualsiasi tipo di input, segnale o interruzione (IO del disco, clic del pulsante, rete, completamento dell'animazione) .

La libreria CLR con tutte le sue funzioni ha un altro grande vantaggio. Durante l'addestramento di C # per sviluppatori junior, la maggior parte di loro ha affermato di apprezzare la convenzione di denominazione logica di classi, membri e spazi dei nomi. Trovare una caratteristica del metodo era logico in tutto l'SDK, qualcosa a cui Visual Basic 5 era gravemente difettoso. Questo li ha aiutati moltissimo ad adottare la biblioteca. Dopo aver appreso la sintassi di una lingua, imparare una nuova libreria è importante per avere una buona conoscenza di qualsiasi SDK. Ti salva dal reinventare la ruota.

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.