2009-07-30 9 views

risposta

12

Sostanzialmente, si tratta di un imbroglio ;-p

Qualunque struct (ossia gli elementi ereditato da ValueType) viene trattata con tipo valore semantica. Ma c'è una conversione di boxe a object se necessario; il che significa che se lanci un struct su un object, verrà creato un oggetto speciale (sull'heap gestito) contenente i dati (come un clone) dal tuo valore *.

La versione in scatola è un riferimento di tipo. È possibile annullare l'estrazione di questo (mediante il cast) alla versione struct, che inverte questo (copia i dati dei cloni dall'oggetto sull'heap nel valore locale).


* = meno che non sia un vuoto Nullable<T>, quali box null; allo stesso modo, null unboxes a un vuoto Nullable<T>.

+0

Potete spiegarmi o indicare un collegamento su come sta avvenendo la magia (imbroglio)? Ad esempio, Struct è un tipo di valore mentre il tipo di riferimento oggetto – skjagini

+0

@skjagini - semplicemente, il compilatore e il runtime possono individuare facilmente che qualcosa è derivato da "ValueType" e trattarlo in modo diverso ... Oltre a questo? ECMA335 –

+0

+1 Anche se linguaggi come C# pretendono che una struttura in scatola sia un tipo di valore, all'interno del budello del CLR ogni tipo di valore gestito ha un tipo di classe corrispondente che incapsula un campo del tipo di valore corrispondente e racchiude tutti i membri in quelli di quel campo. Anche se le specifiche del linguaggio C# chiamano una cosa del genere un tipo di valore, si comportano come un tipo di riferimento. – supercat

Problemi correlati