Unsafe.Unbox<T>(Object) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Retorna um mutable ref
para um valor convertido.
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
O tipo a ser unboxed.
Parâmetros
- box
- Object
O valor para desconversão.
Retornos
Um mutable ref
para o valor convertido box
.
Exceções
box
é null
, e T
é um tipo de valor não anulável.
Não foi possível localizar T
.
Comentários
O Unbox<T>
método é simplesmente um wrapper para a instrução il unbox . Ele é útil como uma otimização de desempenho. Sempre que uma API que usa um Object precisa ser chamada repetidamente com valores diferentes de um tipo de valor, o mesmo objeto de caixa pode ser reutilizado em vez de um novo criado a cada vez.
O Unbox<T>
método tem uma restrição de uso importante que não é imposta por compiladores de linguagem e que é responsabilidade do chamador. A instrução IL unbox
retorna um ponteiro gerenciado de mutabilidade controlada. Como os compiladores de linguagem .NET e .NET não podem representar essa restrição, o Unbox<T>
método retorna um mutável ref T
normal. No entanto, os desenvolvedores não devem modificar a referência retornada, a menos que estejam certos de que T
é um tipo de struct mutável. Por exemplo, como os primitivos numéricos, como Int32 não são tipos de struct mutáveis, o código a seguir não é suportado:
// The following line is NOT SUPPORTED.
Unsafe.Unbox<int>(obj) = 30;
Por outro lado, um tipo como Point é um struct mutável com setters de propriedade pública, portanto, há suporte para a mutação do valor em caixa chamando os setters de propriedade:
// The following lines are legal and supported.
Unsafe.Unbox<System.Drawing.Point>(obj).X = 50;
Unsafe.Unbox<System.Drawing.Point>(obj).Y = 70;
No entanto, não há suporte para a substituição de todo o atacado de referência, mesmo que a referência seja para um tipo de struct mutável.
// 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 obter mais informações, incluindo uma discussão detalhada sobre as restrições de uso desta instrução, consulte as seções III.1.8.1.2.2 ("Ponteiros gerenciados de mutabilidade controlada") e III.4.32 ("unbox -- converter tipo de valor em caixa em sua forma bruta") em ECMA-335: Common Language Infrastructure (CLI).