Unsafe Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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 |
| 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 |
| BitCast<TFrom,TTo>(TFrom) |
Reinterpretuje danou hodnotu typu |
| 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 |
| Copy<T>(Void*, T) |
Zkopíruje hodnotu typu |
| 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 |
| 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 |
| IsNullRef<T>(T) |
Určuje, zda daný spravovaný ukazatel na hodnotu typu |
| NullRef<T>() |
Vrátí ukazatel spravovaný hodnotou null na hodnotu typu |
| Read<T>(Void*) |
Načte hodnotu typu |
| ReadUnaligned<T>(Byte) |
Načte hodnotu typu |
| ReadUnaligned<T>(Void*) |
Přečte hodnotu typu |
| 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) |
|
| Write<T>(Void*, T) |
Zapíše hodnotu typu |
| WriteUnaligned<T>(Byte, T) |
Zapíše hodnotu typu |
| WriteUnaligned<T>(Void*, T) |
Zapíše hodnotu typu |