Condividi tramite


Unsafe.Unbox<T>(Object) Metodo

Definizione

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

T

mutable ref al valore boxed box.

Eccezioni

box è null e T è un tipo di valore non nullable.

box non è un tipo valore boxed.

-oppure-

box non è un oggettto T boxed.

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)).

Si applica a