2009-10-21 13 views
7

Ho cercato di capire l'uso di "primitive" in Java e C# e la differenza tra loro (se presente). Ho fatto una serie di domande su SO e alcune risposte sembrano confondere il problema piuttosto che chiarirlo. Alcune risposte (e alcuni documenti MS) sembrano fornire affermazioni contraddittorie. Da SODefinizioni di "primitivo", "tipo di valore", "struct", "classe", "wrap" in Java e C#

e da MS: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx - "le strutture sono molto simili a classi" - "la classe Int32 avvolge il tipo di dati int" - "On D'altra parte, tutti i tipi di dati primitivi in ​​C# sono oggetti nello spazio dei nomi Sistema. Per ogni tipo di dati, viene fornito un nome breve o un alias. Ad esempio, int è il nome breve per Sistema .Int32" .

La mia confusione si trova in gran parte con C# (ho programmato Java per un po 'di tempo).

EDIT Il seguente paragrafo è stato confermato di essere corretto da @ Jon Skeet

  • Java ha due tipi (primitivi e di classe). Le parole "tipo di valore" potrebbero essere un sinonimo di primitivo (anche se non ampiamente utilizzato) e "tipo di riferimento" per la classe. Java "avvolge" primitivi (int) in classi (intero) e di queste classi hanno il potere completo di qualsiasi altra classe (può essere nullo, utilizzato in collezioni, ecc)

EDIT @ Jon ha dato un dichiarazione molto chiara su C# in modo da eliminare le mie verità suggerite e fare riferimento alla sua risposta.

Ulteriore domanda: esiste un consenso su quale dovrebbe essere l'uso effettivo di questi termini? Se c'è un consenso, sarei molto grato per averlo esplicitamente esplicitato. Altrimenti suppongo che la terminologia sia confusa e quindi di uso limitato.

RIASSUNTO Grazie per le risposte molto chiare. C'è un consenso (vedi risposta accettata da @Jon) tra coloro che lo capiscono e i documenti MS sono coerenti (sebbene si riferiscano a Java in alcuni punti e li ho erroneamente letti per C#)

risposta

11

Il primo punto elenco è corretto.

Il secondo non è: the primitive types in .NET sono Booleano, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double e Single. Una struct non può di solito essere impostata su null, ma esistono anche tipi di valori nullable (Nullable<T>). Questi sono ancora tipi di valore, ma in C# c'è lo zucchero sintattico per equiparare "null" con "il valore null per il tipo", che per un tipo di valore nullable è un'istanza in cui HasValue restituisce false.

int e System.Int32sono sinonimi esatti in C#. Il primo è solo un alias per quest'ultimo. Compilano allo esattamente lo lo stesso codice.

In C#, le classi e le interfacce sono sempre tipi di riferimento. Le strutture e le enumerazioni sono tipi di valore - ma esiste un equivalente in scatola di ogni struttura (diversa da Nullable<T> che viene gestita in modo diverso dal CLR in termini di boxe). I tipi in scatola non hanno nomi separati e non possono essere indicati esplicitamente in C# (sebbene possano essere in C++/CLI). Non esiste separato equivalente alla classe wrapper come java.lang.Integer in .NET; sarebbe problematico introdurre tali classi in quanto è possibile creare i propri tipi di valore in .NET, a differenza di Java.

Per ulteriori informazioni sui tipi di riferimento e sui tipi di valore, vedere my article about it.

+1

@Jon ha modificato la domanda e rimosso il secondo punto, invece ha indicato la risposta. –

12

Non ho visto documenti MS essere contraddittorio su questo (MSDN a volte è sbagliato, ma su questo specifico problema, l'ho sempre visto corretto). Il link che hai postato MSDN dice:

Per ogni tipo di dati primitivi in ​​Java, la libreria di classi di base fornisce una classe wrapper che lo rappresenta come un oggetto Java . Ad esempio, la classe Int32 include il tipo di dati int e la classe Double include il tipo double data .

D'altra parte, tutti i dati primitivi tipi in C# sono oggetti nel namespace System . Per ogni tipo di dati, viene fornito un breve nome o alias .Per l'istanza , int è il nome breve per System.Int32 e doppio è il breve modulo di System.Double.

Fondamentalmente, sta dicendo la cosa giusta. In Java, la classe Integer è un wrapper per il tipo primitivo int. In C#, int è un alias per la struttura System.Int32. Il primo paragrafo riguarda Java e non si applica a in C#.


Nel NET, la terminologia è la seguente:

Un primitivo tipo è un tipo che ha IsPrimitive property impostato su TRUE. I tipi primitivi sono:

I tipi primitivi sono booleano, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, doppio e singolo.

Tutti i tipi primitivi sono tipi di valore, ma non viceversa .

A tipo di valore è un type that has value semantics, as opposed to reference semantics. L'intero valore viene copiato quando viene passato per valore (non è il suo riferimento). Le variabili locali dei tipi di valore sono memorizzate nello stack. struct s e enum s sono tipi di valore.

Come detto sopra, tutti i tipi primitivi sono tipi di valore. Sono struct s nello spazio dei nomi System. In C#, int, double, ecc., Le parole chiave sono fondamentalmente alias per quelle struct s.