Unsafe.Unbox<T>(Object) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Restituisce un mutable ref
a un valore boxed.
public:
generic <typename T>
where T : value class static T % Unbox(System::Object ^ box);
public static ref T Unbox<T> (object box) where T : struct;
static member Unbox : obj -> 'T (requires 'T : struct)
Public Shared Function Unbox(Of T As Structure) (box As Object) As T
Parametri di tipo
- T
Tipo di cui eseguire la conversione unboxing.
Parametri
- box
- Object
Valore di cui eseguire la conversione unboxing.
Restituisce
mutable ref
al valore boxed box
.
Eccezioni
box
è null
e T
è un tipo di valore non nullable.
Non è possibile trovare l'oggetto T
.
Commenti
Il Unbox<T>
metodo è semplicemente un wrapper per l'istruzione unbox IL. È utile come ottimizzazione delle prestazioni. Ogni volta che un'API che accetta un Object oggetto deve essere chiamata ripetutamente con valori diversi di un tipo valore, lo stesso oggetto box può essere riutilizzato anziché un nuovo oggetto creato ogni volta.
Il Unbox<T>
metodo ha un vincolo di utilizzo importante che non viene applicato dai compilatori del linguaggio ed è responsabilità del chiamante. L'istruzione IL unbox
restituisce un puntatore gestito con mutabilità controllata. Poiché i compilatori di linguaggi .NET e .NET non possono rappresentare questo vincolo, il Unbox<T>
metodo restituisce un normale modificabile ref T
. Tuttavia, gli sviluppatori non devono modificare il riferimento restituito, a meno che non siano certi che T
sia un tipo di struct modificabile. Ad esempio, poiché le primitive numeriche, Int32 ad esempio, non sono tipi di struct modificabili, il codice seguente non viene intercerato:
// The following line is NOT SUPPORTED.
Unsafe.Unbox<int>(obj) = 30;
Al contrario, un tipo come Point è uno struct modificabile con setter di proprietà pubbliche, quindi la modifica del valore boxed chiamando i setter di proprietà è supportata:
// The following lines are legal and supported.
Unsafe.Unbox<System.Drawing.Point>(obj).X = 50;
Unsafe.Unbox<System.Drawing.Point>(obj).Y = 70;
Tuttavia, la sostituzione dell'intero riferimento all'ingrosso non è supportata, anche se il riferimento è a un tipo di struct modificabile.
// Resetting the reference to default(T) is NOT SUPPORTED.
Unsafe.Unbox<System.Drawing.Point>(obj) = default(System.Drawing.Point);
// Setting the reference to a completely new value is NOT SUPPORTED.
Unsafe.Unbox<System.Drawing.Point>(obj) = new System.Drawing.Point(50, 70);
Per altre informazioni, inclusa la descrizione dettagliata dei vincoli di utilizzo di questa istruzione, vedere le sezioni III.1.8.1.2.2 ("Puntatori gestiti con mutabilità controllata") e III.4.32 ("unbox -- convert boxed value type to its raw form") in ECMA-335: Common Language Infrastructure (CLI)).