Sdílet prostřednictvím


Unsafe Třída

Definice

Obsahuje obecné funkce nízké úrovně pro manipulaci se spravovanými a nespravovanými ukazateli.

public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
Dědičnost
Unsafe

Poznámky

Upozornění

Tento typ je určený pro pokročilé scénáře manipulace s ukazatelem. Předpokládá se, že volající jsou obeznámeni s ECMA-335, sec. II.14.4 a III.1.1.5 a s dodatkem ke specifikaci ROZHRANÍ PŘÍKAZOVÉHO ŘÁDKU ECMA-335.

Většina rozhraní API tohoto typu neprovádí žádnou kontrolu ani ověřování argumentů. Nesprávné použití těchto rozhraní API může poškodit paměť procesu nebo stabilizovat modul runtime .NET.

Tento typ obvykle používají autoři knihoven nízké úrovně, kteří chtějí psát vysoce výkonný kód a jsou ochotni potlačit . Net provádí typické bezpečnostní kontroly typů, aby byly splněny jejich výkonnostní cíle.

Podívejte se na následující příklad, který obrátí prvky v rámci objektu Span<T>.

Poznámka

Tyto příklady existují pouze pro demonstrační účely. V reálných aplikacích by vývojáři měli místo toho používat pomocné funkce jako Reverse, které jsou optimalizované lépe než tyto příklady.

// 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];
  }
}

Tato metoda je plně typově bezpečná a modul runtime .NET může vkládat kontroly hranic, které pomáhají vynucovat bezpečnost. Autoři knihoven nižší úrovně však mohou chtít potlačit . Net provádí běžné bezpečnostní kontroly za účelem zlepšení výkonu vlastního kódu. Tito vývojáři by se při vynucení správnosti obvykle spoléhali na nástroje pro statickou analýzu nebo na vlastní revize kódu. Rozhraní Unsafe API umožňují vývojáři přepsat tento kód pomocí neověřitelných konstruktorů, jak ukazuje následující příklad.

// 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 Vzhledem k tomu, že rozhraní API potlačí typické ověřování zabezpečení typu, je na volajících, aby zajistili, že kód, který píšou, je legální. Zneužití těchto rozhraní API může způsobit narušení přístupu, vytvořit díry pro uvolňování paměti, vytvořit nesprávný kód nebo jinak vyvolat nedefinované a destabilní chování v rámci modulu runtime .NET.

Metody

Add<T>(T, Int32)

Přidá posun k danému spravovanému ukazateli.

Add<T>(T, IntPtr)

Přidá posun prvku k danému spravovanému ukazateli.

Add<T>(T, UIntPtr)

Přidá posun prvku k danému spravovanému ukazateli.

Add<T>(Void*, Int32)

Přidá posun prvku k danému nespravovanému ukazateli.

AddByteOffset<T>(T, IntPtr)

Přidá posun bajtů k danému spravovanému ukazateli.

AddByteOffset<T>(T, UIntPtr)

Přidá posun bajtů k danému spravovanému ukazateli.

AreSame<T>(T, T)

Určuje, zda zadané spravované ukazatele odkazují na stejné umístění.

As<T>(Object)

Přetypuje daný objekt na zadaný typ.

As<TFrom,TTo>(TFrom)

Přeloží daný spravovaný ukazatel jako nový spravovaný ukazatel na hodnotu typu TTo.

AsPointer<T>(T)

Převede spravovaný ukazatel na nespravovaný ukazatel.

AsRef<T>(T)

Reinterpretuje daný odkaz jen pro čtení jako proměnlivý odkaz.

AsRef<T>(Void*)

Převede nespravovaný ukazatel na spravovaný ukazatel na hodnotu typu T.

BitCast<TFrom,TTo>(TFrom)

Reinterpretuje danou hodnotu typu TFrom jako hodnotu typu TTo.

ByteOffset<T>(T, T)

Určuje posun bajtů od původu k cíli z daných spravovaných ukazatelů.

Copy<T>(T, Void*)

Zkopíruje hodnotu typu T do daného umístění.

Copy<T>(Void*, T)

Zkopíruje hodnotu typu T do daného umístění.

CopyBlock(Byte, Byte, UInt32)

Zkopíruje bajty ze zdrojové adresy na cílovou adresu.

CopyBlock(Void*, Void*, UInt32)

Zkopíruje bajty ze zdrojové adresy na cílovou adresu.

CopyBlockUnaligned(Byte, Byte, UInt32)

Zkopíruje bajty ze zdrojové adresy na cílovou adresu, aniž by bylo nutné předpokládat zarovnání adres závislých na architektuře.

CopyBlockUnaligned(Void*, Void*, UInt32)

Zkopíruje bajty ze zdrojové adresy na cílovou adresu, aniž by bylo nutné předpokládat zarovnání adres závislých na architektuře.

InitBlock(Byte, Byte, UInt32)

Inicializuje blok paměti v daném umístění s danou počáteční hodnotou.

InitBlock(Void*, Byte, UInt32)

Inicializuje blok paměti v daném umístění s danou počáteční hodnotou.

InitBlockUnaligned(Byte, Byte, UInt32)

Inicializuje blok paměti v daném umístění s danou počáteční hodnotou bez předpokladu, že je zarovnání adresy závislé na architektuře.

InitBlockUnaligned(Void*, Byte, UInt32)

Inicializuje blok paměti v daném umístění s danou počáteční hodnotou bez předpokladu, že je zarovnání adresy závislé na architektuře.

IsAddressGreaterThan<T>(T, T)

Vrátí hodnotu, která označuje, zda je zadaný spravovaný ukazatel větší než jiný zadaný spravovaný ukazatel.

IsAddressLessThan<T>(T, T)

Vrátí hodnotu, která označuje, zda je zadaný spravovaný ukazatel menší než jiný zadaný spravovaný ukazatel.

IsNullRef<T>(T)

Určuje, jestli je daný spravovaný ukazatel na hodnotu typu T odkazem s hodnotou null.

NullRef<T>()

Vrátí ukazatel spravovaný hodnotou null na hodnotu typu T.

Read<T>(Void*)

Načte hodnotu typu T z daného umístění.

ReadUnaligned<T>(Byte)

Načte hodnotu typu T z dané adresy, aniž by za předpokladu, že je na architektuře závislé zarovnání zdrojové adresy.

ReadUnaligned<T>(Void*)

Přečte hodnotu typu T z daného umístění, aniž by za předpokladu, že je zarovnání zdrojové adresy závislé na architektuře.

SizeOf<T>()

Vrátí velikost hodnoty daného parametru typu.

SkipInit<T>(T)

Obchází určitá pravidla přiřazení pro danou referenci.

Subtract<T>(T, Int32)

Odečte posun od daného spravovaného ukazatele.

Subtract<T>(T, IntPtr)

Odečte posun prvku od daného spravovaného ukazatele.

Subtract<T>(T, UIntPtr)

Odečte posun prvku od daného spravovaného ukazatele.

Subtract<T>(Void*, Int32)

Odečte posun prvku od daného nespravovaného ukazatele.

SubtractByteOffset<T>(T, IntPtr)

Odečte posun bajtů od daného spravovaného ukazatele.

SubtractByteOffset<T>(T, UIntPtr)

Odečte posun bajtů od daného spravovaného ukazatele.

Unbox<T>(Object)

mutable ref Vrátí hodnotu na hodnotu v rámečku.

Write<T>(Void*, T)

Zapíše hodnotu typu T do daného umístění.

WriteUnaligned<T>(Byte, T)

Zapíše hodnotu typu T do daného umístění bez předpokladu, že je zarovnání cílové adresy závislé na architektuře.

WriteUnaligned<T>(Void*, T)

Zapíše hodnotu typu T do daného umístění bez předpokladu, že je zarovnání cílové adresy závislé na architektuře.

Platí pro