Unsafe Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Содержит универсальные низкоуровневые функции для управления управляемыми и неуправляемными указателями.
public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
- Наследование
-
Unsafe
Комментарии
Предупреждение
Этот тип предназначен для расширенных сценариев работы с указателями. Предполагается, что вызывающие абоненты знакомы с ECMA-335, sec. II.14.4 и III.1.1.5, а также с дополнением к спецификации ИНТЕРФЕЙСА командной строки ECMA-335.
Большинство API этого типа не выполняют проверку или проверку аргументов. Неправильное использование этих API может повредить память процесса или дестабилизировать среду выполнения .NET.
Этот тип обычно используется низкоуровневыми авторами библиотек, которые хотят писать высокопроизводительный код и готовы подавлять . Типичные проверки безопасности типов NET в соответствии с целями производительности.
Рассмотрим следующий пример, в котором элементы в обратном направлении в объекте .Span<T>
Примечание
Эти примеры существуют просто для демонстрации. В реальных приложениях разработчикам следует вместо этого использовать вспомогательные функции, такие как Reverse, которые лучше оптимизированы, чем даже эти примеры.
// A safe, verifiable way to reverse a Span<T>.
static void Reverse<T>(Span<T> span)
{
while (span.Length > 1)
{
T firstElement = span[0];
T lastElement = span[^1];
span[0] = lastElement;
span[^1] = firstElement;
span = span[1..^1];
}
}
Этот метод полностью типобезопасн, и среда выполнения .NET может вставлять проверки границ для обеспечения безопасности. Однако авторам низкоуровневых библиотек может потребоваться отключить . Обычные проверки безопасности NET для повышения производительности собственного кода. Такие разработчики, как правило, используют средства статического анализа или собственные проверки кода для обеспечения правильности.
Unsafe
API-интерфейсы позволяют разработчику переписать этот код с помощью непроверяемых конструкций, как показано в следующем примере.
// A correct but unverifiable way to reverse a Span<T>.
static void Reverse<T>(Span<T> span)
{
if (span.Length > 1)
{
ref T refLeft = ref MemoryMarshal.GetReference(span);
ref T refRight = ref Unsafe.Add(ref refLeft, span.Length - 1);
do
{
T leftElement = refLeft;
T rightElement = refRight;
refLeft = rightElement;
refRight = leftElement;
refLeft = ref Unsafe.Add(ref refLeft, 1);
refRight = ref Unsafe.Subtract(ref refRight, 1);
} while (Unsafe.IsAddressLessThan(ref refLeft, ref refRight));
}
}
Unsafe
Так как API подавляют типичную проверку безопасности типов, вызывающие стороны должны убедиться, что код, который они пишут, является допустимым. Неправильное использование этих API-интерфейсов может привести к нарушениям доступа, созданию отверстий в сборке мусора, неправильному коду или иным образом вызвать неопределенное и дестабилизирующее поведение в среде выполнения .NET.
Методы
Add<T>(T, Int32) |
Добавляет смещение к заданному управляемому указателю. |
Add<T>(T, IntPtr) |
Добавляет смещение элемента к заданному управляемому указателю. |
Add<T>(T, UIntPtr) |
Добавляет смещение элемента к заданному управляемому указателю. |
Add<T>(Void*, Int32) |
Добавляет смещение элемента в заданный неуправляемый указатель. |
AddByteOffset<T>(T, IntPtr) |
Добавляет смещение байтов к заданному управляемому указателю. |
AddByteOffset<T>(T, UIntPtr) |
Добавляет смещение байтов к заданному управляемому указателю. |
AreSame<T>(T, T) |
Определяет, указывают ли указанные управляемые указатели на одно и то же расположение. |
As<T>(Object) |
Приводит заданный объект к указанному типу. |
As<TFrom,TTo>(TFrom) |
Повторно интерпретирует данный управляемый указатель как новый управляемый указатель на значение типа |
AsPointer<T>(T) |
Преобразует управляемый указатель в неуправляемый указатель. |
AsRef<T>(T) |
Повторно интерпретирует указанную ссылку только для чтения как изменяемую ссылку. |
AsRef<T>(Void*) |
Преобразует неуправляемый указатель в управляемый указатель в значение типа |
BitCast<TFrom,TTo>(TFrom) |
Повторно интерпретирует заданное значение типа |
ByteOffset<T>(T, T) |
Определяет смещение байтов от источника к целевому объекту от заданных управляемых указателей. |
Copy<T>(T, Void*) |
Копирует значение типа |
Copy<T>(Void*, T) |
Копирует значение типа |
CopyBlock(Byte, Byte, UInt32) |
Копирует байты из адреса источника в адрес назначения. |
CopyBlock(Void*, Void*, UInt32) |
Копирует байты из адреса источника в адрес назначения. |
CopyBlockUnaligned(Byte, Byte, UInt32) |
Копирует байты из адреса источника в адрес назначения без учета архитектурно зависимого выравнивания адресов. |
CopyBlockUnaligned(Void*, Void*, UInt32) |
Копирует байты из адреса источника в адрес назначения без учета архитектурно зависимого выравнивания адресов. |
InitBlock(Byte, Byte, UInt32) |
Инициализирует блок памяти в указанном расположении с заданным начальным значением. |
InitBlock(Void*, Byte, UInt32) |
Инициализирует блок памяти в указанном расположении с заданным начальным значением. |
InitBlockUnaligned(Byte, Byte, UInt32) |
Инициализирует блок памяти в указанном расположении с заданным начальным значением без учета архитектурно зависимого выравнивания адреса. |
InitBlockUnaligned(Void*, Byte, UInt32) |
Инициализирует блок памяти в указанном расположении с заданным начальным значением без учета архитектурно зависимого выравнивания адреса. |
IsAddressGreaterThan<T>(T, T) |
Возвращает значение, указывающее, больше ли указанный управляемый указатель, чем другой указанный управляемый указатель. |
IsAddressLessThan<T>(T, T) |
Возвращает значение, указывающее, меньше ли указанный управляемый указатель, чем другой указанный управляемый указатель. |
IsNullRef<T>(T) |
Определяет, является ли данный управляемый указатель на значение типа |
NullRef<T>() |
Возвращает пустой управляемый указатель на значение типа |
Read<T>(Void*) |
Считывает значение типа |
ReadUnaligned<T>(Byte) |
Считывает значение типа |
ReadUnaligned<T>(Void*) |
Считывает значение типа |
SizeOf<T>() |
Возвращает размер значения заданного параметра типа. |
SkipInit<T>(T) |
Обход определенных правил присваивания для данной ссылки. |
Subtract<T>(T, Int32) |
Вычитает смещение из заданного управляемого указателя. |
Subtract<T>(T, IntPtr) |
Вычитает смещение элемента из заданного управляемого указателя. |
Subtract<T>(T, UIntPtr) |
Вычитает смещение элемента из заданного управляемого указателя. |
Subtract<T>(Void*, Int32) |
Вычитает смещение элемента из заданного неуправляемого указателя. |
SubtractByteOffset<T>(T, IntPtr) |
Вычитает смещение в байтах из заданного управляемого указателя. |
SubtractByteOffset<T>(T, UIntPtr) |
Вычитает смещение в байтах из заданного управляемого указателя. |
Unbox<T>(Object) |
Возвращает ссылку |
Write<T>(Void*, T) |
Записывает значение типа |
WriteUnaligned<T>(Byte, T) |
Записывает значение типа |
WriteUnaligned<T>(Void*, T) |
Записывает значение типа |