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

Warning

Tento typ je určený pro pokročilé scénáře manipulace s ukazateli. Volající se předpokládá, že jsou obeznámeni s ECMA-335, s. II.14.4 a III.1.1.5 a s doplňkem specifikace ROZHRANÍ příkazového řádku ECMA-335.

Většina rozhraní API tohoto typu neprovádí žádnou kontrolu nebo ověření argumentů. Nesprávné použití těchto rozhraní API může poškodit paměť procesu nebo narušit 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 typické kontroly bezpečnosti typů .NET, aby splnily své cíle výkonu.

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

Note

Tyto příklady existují jednoduše pro demonstrační účely. V reálných aplikacích by vývojáři měli místo toho používat pomocné funkce, jako Reversejsou , které jsou lépe optimalizované než i 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í vynutit bezpečnost. Autoři knihoven nízké úrovně však mohou chtít potlačit normální bezpečnostní kontroly .NET, aby zlepšili výkon vlastního kódu. Tito vývojáři se obvykle spoléhají na nástroje pro statickou analýzu nebo na vlastní revize kódu, které pomáhají vynutit správnost. 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í bezpečnosti typů, je na volajících, aby se ujistili, že kód, který píše, je právní. Zneužití těchto rozhraní API může způsobit narušení přístupu, vytvořit díry v paměti, vytvořit nesprávný kódgen nebo jinak vyvolat nedefinované a blokující chování v rámci modulu runtime .NET.

Metody

Name Description
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)

Reinterpretuje 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 zdroje 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 do cílové adresy.

CopyBlock(Void*, Void*, UInt32)

Zkopíruje bajty ze zdrojové adresy do cílové adresy.

CopyBlockUnaligned(Byte, Byte, UInt32)

Zkopíruje bajty ze zdrojové adresy na cílovou adresu bez předpokladu, že architektura závisí na zarovnání adres.

CopyBlockUnaligned(Void*, Void*, UInt32)

Zkopíruje bajty ze zdrojové adresy na cílovou adresu bez předpokladu, že architektura závisí na zarovnání adres.

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 architektura závislá na zarovnání adresy.

InitBlockUnaligned(Void*, Byte, UInt32)

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

IsAddressGreaterThan<T>(T, T)

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

IsAddressGreaterThanOrEqualTo<T>(T, T)

Určuje, zda adresa paměti, na kterou left odkazuje, je větší nebo rovna adrese paměti, na kterou rightodkazuje .

IsAddressLessThan<T>(T, T)

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

IsAddressLessThanOrEqualTo<T>(T, T)

Určuje, zda adresa paměti, na kterou left odkazuje, je menší než nebo rovna adrese paměti, na kterou rightodkazuje .

IsNullRef<T>(T)

Určuje, zda daný spravovaný ukazatel na hodnotu typu T je nulový odkaz.

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 bez předpokladu, že architektura závisí na zarovnání zdrojové adresy.

ReadUnaligned<T>(Void*)

Přečte hodnotu typu T z daného umístění bez předpokladu, že architektura závisí na zarovnání zdrojové adresy.

SizeOf<T>()

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

SkipInit<T>(T)

Obchází určitá pravidla přiřazení pro daný odkaz.

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 do 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 architektura závisí na zarovnání cílové adresy.

WriteUnaligned<T>(Void*, T)

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

Platí pro