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


Unsafe.AsRef Метод

Определение

Перегрузки

AsRef<T>(Void*)

Преобразует неуправляемый указатель в управляемый указатель на значение типа T.

AsRef<T>(T)

Повторно интерпретирует указанную ссылку, доступную только для чтения, как изменяемую ссылку.

AsRef<T>(Void*)

Исходный код:
Unsafe.cs
Исходный код:
Unsafe.cs
Исходный код:
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 ("Выравнивание").

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

AsRef<T>(T)

Исходный код:
Unsafe.cs
Исходный код:
Unsafe.cs
Исходный код:
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);
  }
}

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