Unsafe.Unbox<T>(Object) Método

Definición

Devuelve un mutable ref a un valor con conversión boxing.

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

Parámetros de tipo

T

Tipo que se va a desboxear.

Parámetros

box
Object

El valor al que aplicar la conversión unboxing.

Devoluciones

T

Un mutable ref al valor al que se ha aplicado la conversión boxing box.

Excepciones

box es null, y T es un tipo de valor que no acepta valores NULL.

box no es un tipo de valor al que se ha aplicado la conversión boxing.

o bien

box no es un T al que se ha aplicado una conversión boxing.

No se encuentra T.

Comentarios

El Unbox<T> método es simplemente un contenedor para la instrucción unbox de IL. Es útil como una optimización del rendimiento. Cada vez que es necesario llamar a una API que toma una Object llamada repetidamente con valores diferentes de un tipo de valor, el mismo objeto de cuadro se puede reutilizar en lugar de crear uno nuevo cada vez.

El Unbox<T> método tiene una restricción de uso importante que no aplica los compiladores de lenguaje y que es responsabilidad del autor de la llamada. La instrucción IL unbox devuelve un puntero administrado de mutabilidad controlada. Dado que los compiladores de lenguaje .NET y .NET no pueden representar esta restricción, el Unbox<T> método devuelve una mutable ref Tnormal. Sin embargo, los desarrolladores no deben mutar la referencia devuelta a menos que estén seguros de que T es un tipo de estructura mutable. Por ejemplo, dado que los primitivos numéricos como Int32 no son tipos de struct mutables, no se proporciona el código siguiente:

// The following line is NOT SUPPORTED.
Unsafe.Unbox<int>(obj) = 30;

Por el contrario, se admite una Point struct mutable con establecedores de propiedades públicas, por lo que se admite la mutación del valor con conversión boxing llamando a los establecedores de propiedades:

// The following lines are legal and supported.
Unsafe.Unbox<System.Drawing.Point>(obj).X = 50;
Unsafe.Unbox<System.Drawing.Point>(obj).Y = 70;

Sin embargo, no se admite la sustitución de toda la referencia al por mayor, incluso si la referencia es a un tipo de estructura mutable.

// 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);

Para obtener más información, incluida la explicación detallada de las restricciones de uso de esta instrucción, vea las secciones III.1.8.1.2.2 ("Punteros administrados de portabilidad controlada") y III.4.32 ("unbox -- convert boxed value type to its raw form") en ECMA-335: Common Language Infrastructure (CLI)).

Se aplica a