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
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 |
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 původu 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 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 |
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 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) |
|
Write<T>(Void*, T) |
Zapíše hodnotu typu |
WriteUnaligned<T>(Byte, T) |
Zapíše hodnotu typu |
WriteUnaligned<T>(Void*, T) |
Zapíše hodnotu typu |