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


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)

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

AsPointer<T>(T)

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

AsRef<T>(T)

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

AsRef<T>(Void*)

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

BitCast<TFrom,TTo>(TFrom)

Повторно интерпретирует заданное значение типа TFrom как значение типа TTo.

ByteOffset<T>(T, T)

Определяет смещение байтов от источника к целевому объекту от заданных управляемых указателей.

Copy<T>(T, Void*)

Копирует значение типа T в заданное расположение.

Copy<T>(Void*, T)

Копирует значение типа 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)

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

NullRef<T>()

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

Read<T>(Void*)

Считывает значение типа T из заданного расположения.

ReadUnaligned<T>(Byte)

Считывает значение типа T из заданного адреса, не предполагая выравнивание исходного адреса, зависящее от архитектуры.

ReadUnaligned<T>(Void*)

Считывает значение типа T из заданного расположения, не предполагая выравнивание исходного адреса, зависящее от архитектуры.

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)

Возвращает ссылку mutable ref на упакованное значение.

Write<T>(Void*, T)

Записывает значение типа T в заданное расположение.

WriteUnaligned<T>(Byte, T)

Записывает значение типа T в заданное расположение, не предполагая выравнивание адреса назначения, зависящее от архитектуры.

WriteUnaligned<T>(Void*, T)

Записывает значение типа T в заданное расположение, не предполагая выравнивание адреса назначения, зависящее от архитектуры.

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