Unsafe.AsRef 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
重载
AsRef<T>(Void*) |
将非托管指针转换为指向 类型的 |
AsRef<T>(T) |
将给定的只读引用重新解释为可变引用。 |
AsRef<T>(Void*)
- Source:
- Unsafe.cs
- Source:
- Unsafe.cs
- Source:
- Unsafe.cs
重要
此 API 不符合 CLS。
将非托管指针转换为指向 类型的 T
值的托管指针。
public:
generic <typename T>
static T % AsRef(void* source);
public static ref T AsRef<T> (void* source);
[System.CLSCompliant(false)]
public static ref T AsRef<T> (void* source);
static member AsRef : nativeptr<unit> -> 'T
[<System.CLSCompliant(false)>]
static member AsRef : nativeptr<unit> -> 'T
类型参数
- T
托管指针的元素类型。
参数
- source
- Void*
要转换的非托管指针。
返回
T
指向 类型的 T
值的托管指针。
- 属性
注解
调用方负责确保生成的托管指针与引用的类型正确对齐。 有关对齐要求的详细信息,请参阅 ECMA-335, Sec. I.12.6.2 (“Alignment”) 。
适用于
AsRef<T>(T)
- Source:
- Unsafe.cs
- Source:
- Unsafe.cs
- Source:
- Unsafe.cs
将给定的只读引用重新解释为可变引用。
public:
generic <typename T>
static T % AsRef(T % source);
public static ref T AsRef<T> (in T source);
public static ref T AsRef<T> (ref T source);
public static ref T AsRef<T> (scoped in T source);
public static ref T AsRef<T> (scoped ref T source);
static member AsRef : 'T -> 'T
Public Shared Function AsRef(Of T) (ByRef source As T) As T
类型参数
- T
引用的基础类型。
参数
- source
- T
要重新解释的只读引用。
返回
T
对 类型的 T
值的可变引用。
注解
此 API 在概念上类似于 C++ 的 const_cast<>
。 调用方负责确保未将数据写入引用的位置。 运行时包含假设只读引用确实是不可变的内部逻辑,违反此固定项的调用方可能会在运行时内触发未定义的行为。
AsRef
通常用于将只读引用传递到等 Add方法中,这些方法接受可变的托管指针作为参数。 请看下面的示例。
int ComputeSumOfElements(ref int refToFirstElement, nint numElements)
{
int sum = 0;
for (nint i = 0; i < numElements; i++)
{
sum += Unsafe.Add(ref refToFirstElement, i);
}
}
如果输入参数为 ref readonly int refToFirstElement
而不是 ref int refToFirstElement
,则前面的示例将不会编译,因为只读引用不能用作 的参数 Add
。 相反, AsRef
可用于删除不可变性约束并允许编译成功,如以下示例所示。
int ComputeSumOfElements(ref readonly int refToFirstElement, nint numElements)
{
int sum = 0;
for (nint i = 0; i < numElements; i++)
{
sum += Unsafe.Add(ref Unsafe.AsRef(ref refToFirstElement), i);
}
}