Unsafe.AsRef Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Перегрузки
| Имя | Описание |
|---|---|
| AsRef<T>(T) |
Повторно интерпретирует указанную ссылку только для чтения в качестве изменяемой ссылки. |
| AsRef<T>(Void*) |
Преобразует неуправляемый указатель в управляемый указатель на значение типа |
AsRef<T>(T)
- Исходный код:
- Unsafe.cs
- Исходный код:
- Unsafe.cs
- Исходный код:
- Unsafe.cs
- Исходный код:
- Unsafe.cs
- Исходный код:
- Unsafe.cs
Повторно интерпретирует указанную ссылку только для чтения в качестве изменяемой ссылки.
public:
generic <typename T>
static T % AsRef(T % source);
public static ref T AsRef<T>(scoped ref readonly T source) where T : allows ref struct;
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 readonly T source);
static member AsRef : 'T -> 'T
Public Shared Function AsRef(Of T) (ByRef source As T) As T
Параметры типа
- T
Базовый тип ссылки.
Параметры
- source
- 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 int refToFirstElementявляетсяref readonly 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);
}
}
Применяется к
AsRef<T>(Void*)
- Исходный код:
- Unsafe.cs
- Исходный код:
- Unsafe.cs
- Исходный код:
- Unsafe.cs
- Исходный код:
- Unsafe.cs
- Исходный код:
- Unsafe.cs
Важно!
Этот API несовместим с CLS.
Преобразует неуправляемый указатель в управляемый указатель на значение типа T.
public:
generic <typename T>
static T % AsRef(void* source);
[System.CLSCompliant(false)]
public static ref T AsRef<T>(void* source) where T : allows ref struct;
public static ref T AsRef<T>(void* source);
[System.CLSCompliant(false)]
public static ref T AsRef<T>(void* source);
[<System.CLSCompliant(false)>]
static member AsRef : nativeptr<unit> -> 'T
static member AsRef : nativeptr<unit> -> 'T
Параметры типа
- T
Элементальный тип управляемого указателя.
Параметры
- source
- Void*
Неуправляемый указатель для преобразования.
Возвращаемое значение
Управляемый указатель на значение типа T.
- Атрибуты
Комментарии
Вызывающий объект отвечает за правильное выравнивание результирующего управляемого указателя для указанного типа. Дополнительные сведения о требованиях к выравниванию см. в разделе ECMA-335, Sec. I.12.6.2 (Выравнивание).