Unsafe.Unbox<T>(Object) Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Devolve a mutable ref a a um valor em caixa.
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 Genérico
- T
Do tipo que se pode desembalar.
Parâmetros
- box
- Object
O valor a desembalar.
Devoluções
A mutable ref ao valor boxem caixa .
Exceções
box é null, e T é um tipo de valor não anulável.
T não pode ser encontrado.
Observações
O Unbox<T> método é simplesmente um wrapper para a instrução de unbox do IL. É útil como otimização de desempenho. Sempre que uma API que toma um Object precisa de ser chamada repetidamente com valores diferentes de um tipo de valor, o mesmo objeto caixa pode ser reutilizado em vez de criar um novo a cada vez.
O Unbox<T> método tem uma importante restrição de uso que não é aplicada pelos compiladores da linguagem e que é responsabilidade do chamador. A instrução IL unbox devolve um ponteiro gerido por mutabilidade controlada. Como os compiladores de linguagens .NET e .NET não conseguem representar esta restrição, o método Unbox<T> devolve um ref T mutável normal. No entanto, os desenvolvedores não devem mutar a referência devolvida a menos que tenham a certeza de que T é um tipo de struct mutável. Por exemplo, como as primitivas numéricas como Int32 não são tipos de struct mutáveis, o seguinte código não é fornecido:
// The following line is NOT SUPPORTED.
Unsafe.Unbox<int>(obj) = 30;
Em contraste, um tipo como Point é uma estrutura mutável com setters de propriedade pública, pelo que a mutação do valor em caixa chamando os setters de propriedade é suportada:
// 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, a substituição total da referência em massa não é suportada, 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 mais informações, incluindo uma discussão detalhada das restrições de utilização desta instrução, veja as secções III.1.8.1.2.2 ("Apontadores geridos por mutabilidade controlada") e III.4.32 ("unbox -- converter o tipo de valor em caixa para a sua forma bruta") em ECMA-335: Common Language Infrastructure (CLI)).