Unsafe.AsRef 方法

定义

重载

AsRef<T>(Void*)

将非托管指针转换为指向 类型的 T值的托管指针。

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> (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);
  }
}

适用于