Unsafe Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Enthält allgemeine Funktionen auf niedriger Ebene zum Bearbeiten verwalteter und nicht verwalteter Zeiger.
public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
- Vererbung
-
Unsafe
Hinweise
Warnung
Dieser Typ ist für erweiterte Zeigerbearbeitungsszenarien vorgesehen. Anrufer werden angenommen, dass sie mit ECMA-335, Sec. II.14.4 und III.1.1.5 sowie mit dem ECMA-335 CLI Specification Addendum vertraut sind.
Die meisten APIs für diesen Typ führen keine Argumentüberprüfung oder -validierung durch. Eine falsche Verwendung dieser APIs kann den Prozessspeicher beschädigen oder die .NET-Runtime destabilisieren.
Dieser Typ wird in der Regel von Low-Level-Bibliotheksautoren verwendet, die leistungsstarken Code schreiben möchten und bereit sind, zu unterdrücken. Die typischen Typsicherheitsprüfungen von NET, um ihre Leistungsziele zu erreichen.
Sehen Sie sich das folgende Beispiel an, das die Elemente innerhalb einer Span<T>
umkehrt.
Hinweis
Diese Beispiele dienen lediglich zu Demonstrationszwecken. In realen Anwendungen sollten Entwickler stattdessen Hilfsfunktionen wie Reverseverwenden, die besser optimiert sind als diese Beispiele.
// 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];
}
}
Diese Methode ist vollständig typsicher, und die .NET-Runtime kann Begrenzungsprüfungen einfügen, um die Sicherheit zu erzwingen. Die Autoren von Bibliotheken auf niedriger Ebene möchten jedoch möglicherweise unterdrücken. Die normalen Sicherheitsüberprüfungen von NET, um die Leistung des eigenen Codes zu verbessern. Solche Entwickler würden sich in der Regel auf statische Analysetools oder ihre eigenen Code reviews verlassen, um die Richtigkeit zu erzwingen. Die Unsafe
APIs ermöglichen es einem Entwickler, diesen Code mit nicht überprüfbaren Konstrukten neu zu schreiben, wie im folgenden Beispiel gezeigt.
// 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));
}
}
Da die APIs die Unsafe
typische Typsicherheitsüberprüfung unterdrücken, müssen Aufrufer sicherstellen, dass der code, den sie schreiben, legal ist. Der Missbrauch dieser APIs kann zugriffsverstöße verursachen, GC-Löcher erstellen, falsche Codegen erzeugen oder anderweitig undefinierte und destabilisierende Verhaltensweisen innerhalb der .NET-Runtime induzieren.
Methoden
Add<T>(T, Int32) |
Fügt dem angegebenen verwalteten Zeiger einen Offset hinzu. |
Add<T>(T, IntPtr) |
Fügt dem angegebenen verwalteten Zeiger einen Elementoffset hinzu. |
Add<T>(T, UIntPtr) |
Fügt dem angegebenen verwalteten Zeiger einen Elementoffset hinzu. |
Add<T>(Void*, Int32) |
Fügt dem angegebenen nicht verwalteten Zeiger einen Elementoffset hinzu. |
AddByteOffset<T>(T, IntPtr) |
Fügt dem angegebenen verwalteten Zeiger einen Byteoffset hinzu. |
AddByteOffset<T>(T, UIntPtr) |
Fügt dem angegebenen verwalteten Zeiger einen Byteoffset hinzu. |
AreSame<T>(T, T) |
Bestimmt, ob die angegebenen verwalteten Zeiger auf denselben Speicherort zeigen. |
As<T>(Object) |
Wandelt das angegebene Objekt in den angegebenen Typ um. |
As<TFrom,TTo>(TFrom) |
Interpretiert den angegebenen verwalteten Zeiger als neuen verwalteten Zeiger auf einen Wert vom Typ |
AsPointer<T>(T) |
Konvertiert einen verwalteten Zeiger in einen nicht verwalteten Zeiger. |
AsRef<T>(T) |
Interpretiert den angegebenen schreibgeschützten Verweis als veränderlichen Verweis neu. |
AsRef<T>(Void*) |
Konvertiert einen nicht verwalteten Zeiger in einen verwalteten Zeiger in einen Wert vom Typ |
BitCast<TFrom,TTo>(TFrom) |
Interpretiert den angegebenen Wert des Typs |
ByteOffset<T>(T, T) |
Bestimmt den Byteoffset vom Ursprung zum Ziel aus den angegebenen verwalteten Zeigern. |
Copy<T>(T, Void*) |
Kopiert einen Wert vom Typ |
Copy<T>(Void*, T) |
Kopiert einen Wert vom Typ |
CopyBlock(Byte, Byte, UInt32) |
Kopiert Bytes von der Quelladresse zur Zieladresse. |
CopyBlock(Void*, Void*, UInt32) |
Kopiert Bytes von der Quelladresse zur Zieladresse. |
CopyBlockUnaligned(Byte, Byte, UInt32) |
Kopiert Bytes aus der Quelladresse zur Zieladresse, ohne eine architekturabhängige Ausrichtung der Adressen vorauszusetzen. |
CopyBlockUnaligned(Void*, Void*, UInt32) |
Kopiert Bytes aus der Quelladresse zur Zieladresse, ohne eine architekturabhängige Ausrichtung der Adressen vorauszusetzen. |
InitBlock(Byte, Byte, UInt32) |
Initialisiert einen Speicherblock an dem angegebenen Speicherort mit einem angegebenen Anfangswert. |
InitBlock(Void*, Byte, UInt32) |
Initialisiert einen Speicherblock an dem angegebenen Speicherort mit einem angegebenen Anfangswert. |
InitBlockUnaligned(Byte, Byte, UInt32) |
Initialisiert einen Speicherblock an dem angegebenen Speicherort mit einem angegebenen Anfangswert, ohne eine architekturabhängige Ausrichtung der Adresse vorauszusetzen. |
InitBlockUnaligned(Void*, Byte, UInt32) |
Initialisiert einen Speicherblock an dem angegebenen Speicherort mit einem angegebenen Anfangswert, ohne eine architekturabhängige Ausrichtung der Adresse vorauszusetzen. |
IsAddressGreaterThan<T>(T, T) |
Gibt einen Wert zurück, der angibt, ob ein angegebener verwalteter Zeiger größer als ein anderer angegebener verwalteter Zeiger ist. |
IsAddressLessThan<T>(T, T) |
Gibt einen Wert zurück, der angibt, ob ein angegebener verwalteter Zeiger kleiner als ein anderer angegebener verwalteter Zeiger ist. |
IsNullRef<T>(T) |
Bestimmt, ob ein bestimmter verwalteter Zeiger auf einen Wert vom Typ |
NullRef<T>() |
Gibt einen mit NULL verwalteten Zeiger auf einen Wert vom Typ |
Read<T>(Void*) |
Liest einen Wert vom Typ |
ReadUnaligned<T>(Byte) |
Liest einen Wert vom Typ |
ReadUnaligned<T>(Void*) |
Liest einen Wert vom Typ |
SizeOf<T>() |
Gibt die Größe eines Werts des angegebenen Typparameters zurück. |
SkipInit<T>(T) |
Umgeht bestimmte Zuweisungsregeln für einen bestimmten Verweis. |
Subtract<T>(T, Int32) |
Subtrahiert einen Offset vom angegebenen verwalteten Zeiger. |
Subtract<T>(T, IntPtr) |
Subtrahiert einen Elementoffset vom angegebenen verwalteten Zeiger. |
Subtract<T>(T, UIntPtr) |
Subtrahiert einen Elementoffset vom angegebenen verwalteten Zeiger. |
Subtract<T>(Void*, Int32) |
Subtrahiert einen Elementoffset vom angegebenen nicht verwalteten Zeiger. |
SubtractByteOffset<T>(T, IntPtr) |
Subtrahiert einen Byteoffset vom angegebenen verwalteten Zeiger. |
SubtractByteOffset<T>(T, UIntPtr) |
Subtrahiert einen Byteoffset vom angegebenen verwalteten Zeiger. |
Unbox<T>(Object) |
Gibt eine |
Write<T>(Void*, T) |
Schreibt einen Wert vom Typ |
WriteUnaligned<T>(Byte, T) |
Schreibt einen Wert vom Typ |
WriteUnaligned<T>(Void*, T) |
Schreibt einen Wert vom Typ |