Поделиться через


Unsafe.Unbox<T>(Object) Метод

Определение

Возвращает ссылку mutable ref на упакованное значение.

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

Параметры типа

T

Тип для распаковки.

Параметры

box
Object

Значение для распаковки.

Возвращаемое значение

T

Ссылка mutable ref на упакованное значение box.

Исключения

Значение box — null, а тип значения T не поддерживает значение NULL.

box не является типом упакованного значения.

-или-

box не является упакованным значением T.

T не найден.

Комментарии

Метод Unbox<T> является просто оболочкой для инструкции распаковки IL. Это полезно для оптимизации производительности. Всякий раз, когда API, который принимает Object , необходимо вызывать многократно с разными значениями типа значения, один и тот же объект box можно использовать повторно, а не каждый раз создавать новый.

Метод Unbox<T> имеет важное ограничение использования, которое не применяется языковыми компиляторами и отвечает вызывающий объект. Инструкция IL unbox возвращает управляемый указатель управляемой изменяемости. Так как компиляторы языков .NET и .NET не могут представлять это ограничение, Unbox<T> метод возвращает обычный изменяемый ref Tобъект . Однако разработчики не должны изменять возвращаемую ссылку, если они не уверены, что T является изменяемым типом структуры. Например, поскольку числовые примитивы, такие как Int32 , не являются изменяемыми типами структур, следующий код не поддерживается:

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

В отличие от этого, тип , такой как Point , является изменяемой структурой с открытыми методами задания свойств, поэтому изменение упаковаемого значения путем вызова метода задания свойств поддерживается:

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

Однако замена всей оптовой ссылки не поддерживается, даже если ссылка относится к изменяемому типу структуры.

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

Дополнительные сведения, включая подробное обсуждение ограничений использования этой инструкции, см. в разделах III.1.8.1.2.2 ("Управляемые указатели с управляемой изменяемостью") и III.4.32 ("распаковка — преобразование упакованного типа значения в необработанную форму") в ECMA-335: common Language Infrastructure (CLI).

Применяется к