2012-01-14 11 views
12

Questa è una domanda molto generale. Sono un 'programmatore' autodidatta che programma in C#. Un progetto su cui vorrei lavorare sarebbe molto più semplice (nel grande schema delle cose) se conoscessi il C++. Quanto è facile passare da C# a C++? Per eventuali insidie ​​dovrei fare attenzione? E se sto usando VS2010, posso programmare qualcosa (non nella stessa classe, ma nello stesso progetto) in C# e C++?Passare da C# a C++ (più lavorare con entrambi nella stessa soluzione)

+14

È più facile [spararti in piedi in C++] (http://m5p.com/~pravn/foot.html) e ti farà molto più male che in C#. –

+7

@UweKeim Questo è divertente, ho avuto una bella risata! Grazie! – formatc

+2

@keynesiancross Mi dispiace dire che hai qualche ** davvero ** giorni difficili avanti ahahahahaah – Chani

risposta

21

Spostarsi da C# a C++ non è facile. La sintassi di base può apparire la stessa (ad es. Se, per ...), ma ci sono differenze profonde, ad es. il modello RAII e le variabili di semantica dello stack i cui distruttori sono chiamati quando escono dal campo di applicazione, ecc. non sono presenti in C#.

Inoltre, C# utilizza un garbage collector non deterministico (che può essere OK per le risorse di memoria, ma è inutile per altri tipi di risorse). Invece, con il C++ moderno, puoi usare modelli e puntatori intelligenti (come std ::/boost :: * shared_ptr *), che ti permettono di avere deterministico conteggio di riferimento "garbage collection", che è molto efficiente, ed è valido per risorse di memoria e non di memoria (come handle di file, socket, texture ...).

Inoltre, i C# generici sono molto diversi dai modelli C++ (template C++ sono molto potente, e permettono un livello avanzato di programmazione chiamato modello meta-programmazione).

In VS2010 è possibile avere una soluzione che ospita progetti C++ e C#. Per comunicare tra i due mondi (il mondo nativo di C++ e il mondo gestito di .NET/C#) puoi usare C++/CLI come una sorta di livello di bridging.

In Windows 8 dovrebbe essere introdotta una nuova tecnologia, chiamata WinRT (basata su COM), che consente la comunicazione tra le lingue. In questo caso, è possibile utilizzare C++ con le estensioni del linguaggio WRL (una libreria basata su modelli) o C++/CX per creare componenti C++ che possono essere utilizzati da C# e .NET.

Apprendimento felice.

+1

Grazie per la tua solida risposta. Ora, ammettiamolo, non ho idea di quali siano le prime tre cose di cui parli ... (RAII/pila semantica ??, garbage collector non deterministico ?? e templates ??) – keynesiancross

+1

Se parli di 'shared_ptr' dovresti Almeno menziona anche gli ovvi problemi con esso rispetto a un GC (cicli, multithreading, prestazioni) altrimenti potrebbe portare a sorprese interessanti per l'inconsapevole. Nota secondaria: il conteggio dei ref è efficiente? No, non proprio. – Voo

+0

@Voo: il conteggio dei ref è sicuramente più efficiente di un garbage collector in esecuzione come thread in background e, ad un certo punto nel tempo, congela tutto ciò che sta marcando la memoria e lo spazza. Inoltre, penso che .NET GC sia eseguito sotto pressione di memoria, ma non ha idea di altre risorse (come socket, o memoria texture su schede grafiche, ecc.). Invece con i distruttori C++ e shared_ptr, tutte le risorse (non solo la memoria di sistema) vengono rilasciate non appena nessuno le fa più riferimento. –

5

Posso programmare (non nella stessa classe, ma lo stesso progetto) qualcosa in entrambi C# e C++?

La risposta è no non è possibile. È possibile se si utilizza Managed C++ & C++. Ma se si sta lavorando con C# allora non si può avere codice C# e C++ all'interno stesso progetto

Quanto è facile per passare da C# per C++? `

è un po 'soggettivo, ma a mio parere sarà un passo molto difficile. C++ è una lingua diversa, quindi sarà difficile come imparare una nuova lingua :) di nuovo è soggettiva quindi non entrerò nei dettagli

5

Dato che si sta lavorando con .NET, presumo che si stia utilizzando Visual Studio?

È piuttosto facile combinare C# e C++ nello stesso programma, utilizzando l'opzione del compilatore /clr. Il codice C++ può includere sia classi normali C++ conformi allo standard, sia oggetti ref class .NET progettati per l'uso da C#. I due sono separati ma possono accedere l'un l'altro, tramite i puntatori da ref class a class nativi e il modello gcroot dal numero nativo class a ref class.

Si noti che ho detto "nello stesso programma ", non "nella stessa progetto". Dovrai dividere in due parti, un progetto C# e un progetto C++/CLI, e uno sarà una DLL caricata dall'altro. C'è anche un trucco per combinare i due insieme durante la compilazione in modo da finire con un singolo file eseguibile, ma questo è più un problema che di solito vale la pena.


nota, si potrebbe trovare questa classe puntatore intelligente che ho scritto utile, rende l'uso di class oggetti nativi da .NET ref class oggetti molto più facile.

9

mi è venuto dall'altra parte da C++ a C#. In molti modi è stato un sollievo. C++ ha molte più regole di C#, in particolare per quanto riguarda l'allocazione della memoria. La sintassi può anche essere difficile ed è facile vagare fuori dalla memoria dei limiti. Il C++ è tuttavia molto più adatto per la programmazione a livello di sistema ma lo con una grande potenza è una grande responsabilità.

Io consiglio di prendere una copia di Scott Meyer's Effective C++ e leggerla alla rovescia. Questa è la migliore risorsa che conosca per ottenere le basi corrette e senza dubbio migliorata la qualità del codice che stavo producendo, anche come sviluppatore C++ "esperto". Quindi prendi un quadro di test unitario e dai un'occhiata a uno c++ kata (in questo caso un progetto xcode ma dovrebbe comunque essere utile). E familiarizza con lo Standard Template Library che contiene un sacco di codice/classi utili/efficienti per contenitori, algoritmi, ecc.

Infine, buona fortuna. Imparare una nuova lingua è sempre una sfida e può essere scoraggiante, ma la ricompensa vale generalmente la pena. Se non altro vedrai il tuo codice C# con nuovi occhi.

Problemi correlati