2009-08-31 11 views
5

.NET abbiamo tipi di dati primitivi come int e tipi di valore come struct.Come .NET differenzia il riferimento rispetto ai tipi primitivi e di valore

E inoltre abbiamo tipi di riferimento. Tutti sembrano derivati ​​dalla classe dell'oggetto.

In che modo .NET determina il tipo di valore primitivo rispetto al tipo di riferimento?

Dove è finito? Al compilatore o al JIT?

Questo appartiene alle funzionalità dei compilatori?

+0

Mi dispiace, ma non capisco la tua domanda. –

risposta

11

Tutti i tipi di valore, incluse le primitive Common Type System (CTS) incorporate, derivano DIRETTAMENTE dal tipo CTS "System.ValueType" (tranne le enumerazioni).

Così il compilatore può dire esaminando il tipo di base di qualsiasi tipo. Se è "System.ValueType", allora è un tipo di valore, altrimenti è un tipo di riferimento.

Modifica: enumerazioni, come in

public Enum Shipper {FedEx, Aerborne, USPS, Stork} 

... non derivano direttamente da System.ValueType, derivano da System.Enum, che deriva da System.ValueType ...

+0

Tranne per 'System.Enum', che deriva da' System.ValueType' ma non è un tipo di valore stesso. Ma tutti i tipi di 'enum' * sono * i tipi di valore che derivano da' System.Enum' rendendo il loro tipo di base non 'System.ValueType'. Quindi i tipi di valore sono tipi derivati ​​da 'System.ValueType' ad eccezione di' System.Enum', sebbene l'implementazione interna di questo test possa essere eseguita in modo più efficiente di questo. –

+0

Grazie Carlo. Java funziona in modo simile? –

+0

@ 280Z28: non sono sicuro di cosa significhi, poiché System.Enum non è un tipo che è possibile utilizzare direttamente. In realtà, non è nemmeno abbastanza reale da utilizzare come vincolo su un tipo generico (vedere in fondo http://msdn.microsoft.com/en-us/library/d5x73970.aspx). –

2

I tipi di valore sono in realtà derivati ​​da System.ValueType derivato da System.Object.

2

Valore i tipi sono derivati ​​da System.ValueType, che, tra le altre cose, fornisce un'implementazione predefinita (ma lenta) di GetHashCode e Equals. (Sono lenti perché usano la riflessione).

I tipi primitivi come int possono essere inseriti in tipi di valore in IL utilizzando l'istruzione box. Hanno istruzioni IL speciali per lavorare con loro.

I tipi di riferimento sono tutte le altre classi.

Ci sono anche dei puntatori, che possono essere utilizzati nel codice unsafe e non derivano affatto da object. EDIT - proof.

+0

Sei sicuro che i tipi di puntatore non derivano da IntPtr? –

+0

Sì, sono completamente indipendenti. Per prima cosa, 'IntPtr' è una struttura e non è possibile derivare da una struttura. – SLaks

Problemi correlati