2009-01-26 4 views
12

C# è un superset di C in ogni caso, come Objective-C o C++? C'è un modo per compilare C online con costrutti tali flag di compilazione?C# è un superset di C?

+0

Correlato: http://stackoverflow.com/questions/8586218/is-c-sharp-a-super-set-of-c-just-like-objective-c-and-c –

risposta

37

In una parola, n.

+0

Questo è quello che pensavo, troppo male –

+1

Non direi che è così male.È dimostrato un ottimo modo per rompere con molti problemi di C che risalgono agli anni '80. –

+0

È incredibile che questa risposta ottenga un +18 ... mentre altri che richiedono tempo, ricerca e pensiero non arrivano da nessuna parte. È un peccato. – bobwienholt

12

Non in alcun modo significativo. È ispirato a C (tra gli altri), ma sono lingue fondamentalmente diverse.

10

C# deriva dalla famiglia "c-like" fino a sintassi, ma per quanto riguarda l'architettura sembra più come Java (nessun puntatore [OK, come indicato di seguito, è possibile utilizzarli, ma la maggior parte delle persone non sa o non si preoccupa di ciò], gli array sono controllati, la memoria raccolta dei rifiuti, ecc.).

Si può ottenere molto di ciò in C++, ma non nel nucleo.

+0

ci sono dei puntatori se vuoi usarli – xyz

7

Mettiamola in questo modo:

C e C# sono simili come rm -rf . / e # rm -rf . / sono simili

In breve, non C non è un sottoinsieme di C#. L'aspetto di molte strutture di controllo si basa su C. Come, for-loops, switch, while e così via. Allo stesso tempo, C# proibisce costrutti potenzialmente pericolosi, come la caduta di un caso in un interruttore quando si dimentica un'interruzione; oppure mettendo un intero come condizione if in cui è previsto un booleano. La citazione sopra indica che C# e C possono sembrare molto simili, ma traducono in risultati molto diversi. Dove C non ti impedirà di rimuovere tutto dalla tua partizione, C# ti proteggerà da questo errore per errore, in senso figurato.

A un altro livello, C consente di eseguire il cast di puntatori ai numeri interi, spostarli, eseguire il cast back e quindi accedere alle posizioni di memoria che vengono quindi memorizzate in quel puntatore. C non ti proteggerà dall'accedere alla memoria che non è stata assegnata da te. Avrai un incidente - nel migliore dei casi. C# - dall'altra parte - avrà delle eccezioni che ti noteranno quando fai cose come accedere all'oggetto con riferimento null.

+0

o Java e Javascript apparentemente :) –

+0

Robert, haha ​​sì l'ho strappato da quella analogia: p –

+0

La mia analogia preferita è "Java e JavaScript sono simili come una macchina e il tappeto sono simili. " –

3

C# e C non sono realmente correlati (a parte la sintassi simile). C# viene abbinato al codice macchina da IL all'avvio del programma. C# non ha puntatori con l'eccezione dei tipi di valore su quello stack. C# è completamente sicuro, C non lo è. C richiede una gestione esplicita della memoria dove C# viene raccolto. L'elenco delle differenze potrebbe continuare all'infinito ...

+0

C non richiede la gestione esplicita della memoria; ci sono molte librerie GC. Boehm è uno. – jrockway

+0

Ma ... nativamente C ha ancora bisogno di una gestione esplicita della memoria, sia che la nascondi in una libreria non nasconda il fatto che non è gestita in modo nativo. Con C# è bruciato nell'infrastruttura fin dall'inizio. – Kev

+0

Si potrebbero fare puntatori con codice non sicuro in C# – SQLMenace

4

C++ non è un vero superset di C o (vedi link text)

+1

Tecnicamente si ... Ma praticamente è abbastanza vicino. Ma C# non è vicino a C in molto oltre la sintassi. –

+0

È se si è disposti ad accettare che C è ancora una sua lingua e ha continuato a crescere a se stante e dopo se nato (Bjarne lo chiama discendente diretto) C++, si sono separati. Bjarne lo chiama "una C migliore" ma è una lingua propria con un paradigma diverso. – ChiefTwoPencils

2

C# è molto diverso da C (e anche C++ è molto diverso da C). Questo non perché le semantiche, che alla fine non sono troppo diverse, ma a causa dei concetti, le idee che stanno dietro C#.

Quando si programma in C# è necessario pensare in modo diverso da quello che si è abituati a fare se si utilizza C: questa è la differenza principale.

+1

Ok, morderò: Supponiamo di voler implementare una moltiplicazione di matrice o un bubblesort in C#. Supponiamo anche che io pensi come un programmatore C. Fallirò? –

+0

Posso compilare il codice C all'interno di Obj-C o C++ usando le direttive del compilatore appropriate. Questo è il mio punto di vista –

0

C è obbligatorio. C# è orientato agli oggetti.

+1

I due non si escludono a vicenda, e in effetti direi che sia C che C# sono imperativi e orientati agli oggetti. (Vedi http://stackoverflow.com/questions/351733/can-you-write-object-oriented-code-in-c). E anche se uno di loro non lo fosse, non risponderà in realtà alla domanda se si tratti di un superset! –

Problemi correlati