Прочитать на английском

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


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

Определение

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

public static ref T Unbox<T>(object box) where T : struct;

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

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).

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

Продукт Версии
.NET Core 3.0, Core 3.1, 5, 6 (package-provided), 6, 7, 8, 9, 10
.NET Standard 2.0 (package-provided)