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
Значение для распаковки.
Возвращаемое значение
Ссылка 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).