Ogni definizione di un tipo derivato da ValueType definisce realtà due tipi distinti di cose nel runtime: un tipo di oggetto mucchio (che deriva da ValueType
e passare da Object
e che contiene informazioni sul tipo incorporato) e un tipo di percorso di archiviazione (che non contiene alcuna informazione di tipo incorporato, ma richiede invece che il codice che lo utilizza debba avere altri mezzi per sapere di cosa si tratta). Un'istanza del tipo di oggetto heap contiene un campo del tipo di posizione di archiviazione e il codice che tenta di accedere a this
accede a tale campo. Se un tipo di valore viene inoltrato implicitamente o esplicitamente a un percorso di archiviazione di tipo di riferimento, il sistema creerà un nuovo oggetto heap con il tipo appropriato e copierà tutti i campi pubblici e privati del tipo valore nei campi corrispondenti all'interno dell'oggetto heap. Se un oggetto heap viene eseguito il cast in un percorso di memorizzazione di tipo valore, tutti i campi pubblici e privati dall'oggetto heap verranno copiati nel percorso di memorizzazione del tipo valore.
Se si tenta di utilizzare qualsiasi Object
o metodo di interfaccia su un oggetto heap di un tipo valore, il metodo verrà chiamato proprio come qualsiasi altro metodo heap-object. Se il tentativo viene effettuata su un magazzino value-type, per qualsiasi metodo diverso GetType
, il compilatore genera uno speciale codice operativo "vincolato" che informa il runtime del tipo della posizione di memoria e istruisce il runtime per chiamare l'indirizzo il metodo appropriato per quel tipo. Poiché il compilatore avrà a disposizione il tipo di percorso di archiviazione e il runtime può utilizzarlo per trovare il metodo appropriato, il metodo appropriato può essere richiamato direttamente nel percorso di archiviazione, senza dover prima creare un nuovo oggetto heap. GetType
è l'unica eccezione notevole; poiché funziona esaminando le informazioni di tipo incorporate in un oggetto, può funzionare solo su elementi che contengono informazioni di tipo incorporato. Di conseguenza, il suo argomento verrà convertito nel modulo oggetto-heap prima della chiamata; GetType
sarà quindi in grado di esaminare le informazioni sul tipo incorporato di tale oggetto heap.
tutti i tipi derivano da Object in qualche modo. int deriva da ValueType che deriva da Object. La tua ipotesi 2 è sbagliata. http://ptgmedia.pearsoncmg.com/images/chap13_0321169514/elementLinks/13fig02.gif – 0lukasz0
@ 0lukasz0 [Non * tutto * deriva da oggetto] (http://blogs.msdn.com/b/ericlippert/archive/2009/ 06/08/non-tutto-deriva-da-object.aspx). – vcsjones
"struct Int32 sovrascrive il metodo ValueType.ToString()" risponde alla tua stessa domanda. –