Unsafe Klasa

Definicja

Zawiera ogólne funkcje niskiego poziomu do manipulowania zarządzanymi i niezarządzanych wskaźnikami.

public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
Dziedziczenie
Unsafe

Uwagi

Ostrzeżenie

Ten typ jest przeznaczony dla zaawansowanych scenariuszy manipulowania wskaźnikami. Zakłada się, że osoby wywołujące znają ecMA-335, sec. II.14.4 i III.1.1.5 oraz dodatek specyfikacji interfejsu wiersza polecenia ECMA-335.

Większość interfejsów API tego typu nie przeprowadza sprawdzania ani sprawdzania poprawności argumentów. Nieprawidłowe użycie tych interfejsów API może uszkodzić pamięć procesu lub zdestabilizować środowisko uruchomieniowe platformy .NET.

Ten typ jest zwykle używany przez autorów bibliotek niskiego poziomu, którzy chcą napisać kod o wysokiej wydajności i chcą pominąć . Typowe kontrole bezpieczeństwa typów platformy NET w celu osiągnięcia celów dotyczących wydajności.

Rozważmy poniższy przykład, który odwraca elementy w obiekcie Span<T>.

Uwaga

Te przykłady istnieją po prostu do celów demonstracyjnych. W rzeczywistych aplikacjach deweloperzy powinni zamiast tego używać funkcji pomocników, takich jak Reverse, które są lepiej zoptymalizowane niż nawet te przykłady.

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

Ta metoda jest w pełni bezpieczna pod kątem typów, a środowisko uruchomieniowe platformy .NET może wstawić kontrole granic, aby pomóc w wymuszaniu bezpieczeństwa. Jednak autorzy bibliotek niskiego poziomu mogą chcieć pominąć . Normalne kontrole bezpieczeństwa platformy NET w celu poprawy wydajności własnego kodu. Tacy deweloperzy zwykle polegają na narzędziach do analizy statycznej lub własnych recenzjach kodu, aby ułatwić wymuszanie poprawności. Interfejsy Unsafe API umożliwiają deweloperowi ponowne zapisywanie tego kodu przy użyciu nieweryfikowalnych konstrukcji, jak pokazano w poniższym przykładzie.

// 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 Ponieważ interfejsy API pomijają typową weryfikację bezpieczeństwa typów, należy do wywołujących, aby upewnić się, że kod, który pisze, jest legalny. Nieprawidłowe użycie tych interfejsów API może spowodować naruszenia dostępu, utworzyć otwory GC, wygenerować niepoprawne generowanie kodu lub w inny sposób wywołać niezdefiniowane i destabilizujące zachowania w środowisku uruchomieniowym platformy .NET.

Metody

Add<T>(T, Int32)

Dodaje przesunięcie do danego zarządzanego wskaźnika.

Add<T>(T, IntPtr)

Dodaje przesunięcie elementu do danego zarządzanego wskaźnika.

Add<T>(T, UIntPtr)

Dodaje przesunięcie elementu do danego zarządzanego wskaźnika.

Add<T>(Void*, Int32)

Dodaje przesunięcie elementu do danego niezarządzanego wskaźnika.

AddByteOffset<T>(T, IntPtr)

Dodaje przesunięcie bajtu do danego zarządzanego wskaźnika.

AddByteOffset<T>(T, UIntPtr)

Dodaje przesunięcie bajtu do danego zarządzanego wskaźnika.

AreSame<T>(T, T)

Określa, czy określone zarządzane wskaźniki wskazują tę samą lokalizację.

As<T>(Object)

Rzutuje dany obiekt na określony typ.

As<TFrom,TTo>(TFrom)

Ponownie interpretuje dany wskaźnik zarządzany jako nowy zarządzany wskaźnik do wartości typu TTo.

AsPointer<T>(T)

Konwertuje zarządzany wskaźnik na niezarządzany wskaźnik.

AsRef<T>(T)

Ponownie interpretuje podane odwołanie tylko do odczytu jako odwołanie modyfikowalne.

AsRef<T>(Void*)

Konwertuje niezarządzany wskaźnik na zarządzany wskaźnik na wartość typu T.

BitCast<TFrom,TTo>(TFrom)

Ponownie interpretuje daną wartość typu TFrom jako wartość typu TTo.

ByteOffset<T>(T, T)

Określa przesunięcie bajtów od źródła do celu z podanych zarządzanych wskaźników.

Copy<T>(T, Void*)

Kopiuje wartość typu T do danej lokalizacji.

Copy<T>(Void*, T)

Kopiuje wartość typu T do danej lokalizacji.

CopyBlock(Byte, Byte, UInt32)

Kopiuje bajty z adresu źródłowego do adresu docelowego.

CopyBlock(Void*, Void*, UInt32)

Kopiuje bajty z adresu źródłowego do adresu docelowego.

CopyBlockUnaligned(Byte, Byte, UInt32)

Kopiuje bajty z adresu źródłowego do adresu docelowego bez przy założeniu, że architektura jest zależna od wyrównania adresów.

CopyBlockUnaligned(Void*, Void*, UInt32)

Kopiuje bajty z adresu źródłowego do adresu docelowego bez przy założeniu, że architektura jest zależna od wyrównania adresów.

InitBlock(Byte, Byte, UInt32)

Inicjuje blok pamięci w danej lokalizacji z daną wartością początkową.

InitBlock(Void*, Byte, UInt32)

Inicjuje blok pamięci w danej lokalizacji z daną wartością początkową.

InitBlockUnaligned(Byte, Byte, UInt32)

Inicjuje blok pamięci w danej lokalizacji z daną wartością początkową bez przy założeniu, że wyrównanie adresu zależy od architektury.

InitBlockUnaligned(Void*, Byte, UInt32)

Inicjuje blok pamięci w danej lokalizacji z daną wartością początkową bez przy założeniu, że wyrównanie adresu zależy od architektury.

IsAddressGreaterThan<T>(T, T)

Zwraca wartość wskazującą, czy określony zarządzany wskaźnik jest większy niż inny określony wskaźnik zarządzany.

IsAddressLessThan<T>(T, T)

Zwraca wartość wskazującą, czy określony zarządzany wskaźnik jest mniejszy niż inny określony wskaźnik zarządzany.

IsNullRef<T>(T)

Określa, czy dany zarządzany wskaźnik do wartości typu T jest odwołaniem o wartości null.

NullRef<T>()

Zwraca wskaźnik zarządzany o wartości null do wartości typu T.

Read<T>(Void*)

Odczytuje wartość typu T z danej lokalizacji.

ReadUnaligned<T>(Byte)

Odczytuje wartość typu T z danego adresu bez przy założeniu, że wyrównanie adresu źródłowego zależy od architektury.

ReadUnaligned<T>(Void*)

Odczytuje wartość typu T z danej lokalizacji bez przy założeniu, że wyrównanie adresu źródłowego zależy od architektury.

SizeOf<T>()

Zwraca rozmiar wartości danego parametru typu.

SkipInit<T>(T)

Pomija określone reguły przypisania dla danego odwołania.

Subtract<T>(T, Int32)

Odejmuje przesunięcie od danego zarządzanego wskaźnika.

Subtract<T>(T, IntPtr)

Odejmuje przesunięcie elementu z danego zarządzanego wskaźnika.

Subtract<T>(T, UIntPtr)

Odejmuje przesunięcie elementu z danego zarządzanego wskaźnika.

Subtract<T>(Void*, Int32)

Odejmuje przesunięcie elementu od danego niezarządzanego wskaźnika.

SubtractByteOffset<T>(T, IntPtr)

Odejmuje przesunięcie bajtów od danego zarządzanego wskaźnika.

SubtractByteOffset<T>(T, UIntPtr)

Odejmuje przesunięcie bajtów od danego zarządzanego wskaźnika.

Unbox<T>(Object)

mutable ref Zwraca wartość do wartości pola.

Write<T>(Void*, T)

Zapisuje wartość typu T w danej lokalizacji.

WriteUnaligned<T>(Byte, T)

Zapisuje wartość typu T w podanej lokalizacji bez przy założeniu, że wyrównanie adresu docelowego zależy od architektury.

WriteUnaligned<T>(Void*, T)

Zapisuje wartość typu T w podanej lokalizacji bez przy założeniu, że wyrównanie adresu docelowego zależy od architektury.

Dotyczy