Unsafe.Unbox<T>(Object) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
将 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 的值类型。
找不到 T
。
注解
方法 Unbox<T>
只是 IL 取消装箱 指令的包装器。 它作为性能优化很有用。 每当需要使用值类型的不同值重复调用采用 Object 的 API 时,都可以重复使用同一个 box 对象,而不是每次创建一个新的 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 (“unbox -- 将盒装值类型转换为其原始格式”) ECMA-335 中的“公共语言基础结构 (CLI) ”。