Unsafe Kelas

Definisi

Berisi fungsionalitas generik tingkat rendah untuk memanipulasi pointer terkelola dan tidak terkelola.

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

Keterangan

Peringatan

Jenis ini ditujukan untuk skenario manipulasi pointer tingkat lanjut. Penelepon diasumsikan akrab dengan ECMA-335, Sec. II.14.4 dan III.1.1.5, dan dengan Adendum Spesifikasi ECMA-335 CLI.

Sebagian besar API pada jenis ini tidak melakukan pemeriksaan atau validasi argumen apa pun. Penggunaan API ini yang salah dapat merusak memori proses atau mendesstabilisasi runtime .NET.

Jenis ini biasanya digunakan oleh penulis pustaka tingkat rendah yang ingin menulis kode berkinerja tinggi dan bersedia untuk menekan . Pemeriksaan keamanan jenis khas NET untuk memenuhi tujuan performa mereka.

Pertimbangkan contoh berikut, yang membalikkan elemen dalam Span<T>.

Catatan

Contoh-contoh ini ada hanya untuk tujuan demonstrasi. Dalam aplikasi dunia nyata, pengembang harus menggunakan fungsi pembantu seperti Reverse, yang lebih dioptimalkan daripada bahkan contoh ini.

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

Metode ini sepenuhnya aman jenis dan runtime .NET dapat menyisipkan pemeriksaan batas untuk membantu menegakkan keamanan. Namun, penulis pustaka tingkat rendah mungkin ingin menekan . Pemeriksaan keamanan normal NET untuk meningkatkan performa kode mereka sendiri. Pengembang tersebut biasanya akan mengandalkan alat analisis statis atau ulasan kode mereka sendiri untuk membantu menegakkan kebenaran. Unsafe API memungkinkan pengembang untuk menulis ulang kode ini menggunakan konstruksi yang tidak dapat diverifikasi, seperti yang ditunjukkan contoh berikut.

// 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 Karena API menekan validasi keamanan jenis yang khas, terserah pemanggil untuk memastikan bahwa kode yang mereka tulis adalah legal. Penyalahgunaan API ini dapat menyebabkan pelanggaran akses, membuat lubang GC, menghasilkan codegen yang salah, atau menginduksi perilaku yang tidak terdefinisi dan mendesstabilisasi dalam runtime .NET.

Metode

Add<T>(T, Int32)

Menambahkan offset ke penunjuk terkelola yang diberikan.

Add<T>(T, IntPtr)

Menambahkan offset elemen ke penunjuk terkelola yang diberikan.

Add<T>(T, UIntPtr)

Menambahkan offset elemen ke penunjuk terkelola yang diberikan.

Add<T>(Void*, Int32)

Menambahkan offset elemen ke penunjuk tidak terkelola yang diberikan.

AddByteOffset<T>(T, IntPtr)

Menambahkan offset byte ke penunjuk terkelola yang diberikan.

AddByteOffset<T>(T, UIntPtr)

Menambahkan offset byte ke penunjuk terkelola yang diberikan.

AreSame<T>(T, T)

Menentukan apakah pointer terkelola yang ditentukan menunjuk ke lokasi yang sama.

As<T>(Object)

Melemparkan objek yang diberikan ke jenis yang ditentukan.

As<TFrom,TTo>(TFrom)

Menginterpretasi ulang penunjuk terkelola yang diberikan sebagai penunjuk terkelola baru ke nilai jenis TTo.

AsPointer<T>(T)

Mengonversi penunjuk terkelola menjadi penunjuk yang tidak dikelola.

AsRef<T>(T)

Menginterpretasikan ulang referensi baca-saja yang diberikan sebagai referensi yang dapat diubah.

AsRef<T>(Void*)

Mengonversi penunjuk yang tidak dikelola menjadi penunjuk terkelola ke nilai jenis T.

BitCast<TFrom,TTo>(TFrom)

Menginterpretasi ulang nilai jenis TFrom yang diberikan sebagai nilai jenis TTo.

ByteOffset<T>(T, T)

Menentukan offset byte dari asal ke target dari pointer terkelola yang diberikan.

Copy<T>(T, Void*)

Menyalin nilai jenis T ke lokasi tertentu.

Copy<T>(Void*, T)

Menyalin nilai jenis T ke lokasi tertentu.

CopyBlock(Byte, Byte, UInt32)

Menyalin byte dari alamat sumber ke alamat tujuan.

CopyBlock(Void*, Void*, UInt32)

Menyalin byte dari alamat sumber ke alamat tujuan.

CopyBlockUnaligned(Byte, Byte, UInt32)

Menyalin byte dari alamat sumber ke alamat tujuan tanpa mengasumsikan keselarasan alamat dependen arsitektur.

CopyBlockUnaligned(Void*, Void*, UInt32)

Menyalin byte dari alamat sumber ke alamat tujuan tanpa mengasumsikan keselarasan alamat dependen arsitektur.

InitBlock(Byte, Byte, UInt32)

Menginisialisasi blok memori di lokasi tertentu dengan nilai awal tertentu.

InitBlock(Void*, Byte, UInt32)

Menginisialisasi blok memori di lokasi tertentu dengan nilai awal tertentu.

InitBlockUnaligned(Byte, Byte, UInt32)

Menginisialisasi blok memori di lokasi tertentu dengan nilai awal tertentu tanpa mengasumsikan keselarasan dependen arsitektur alamat.

InitBlockUnaligned(Void*, Byte, UInt32)

Menginisialisasi blok memori di lokasi tertentu dengan nilai awal tertentu tanpa mengasumsikan keselarasan dependen arsitektur alamat.

IsAddressGreaterThan<T>(T, T)

Mengembalikan nilai yang menunjukkan apakah penunjuk terkelola yang ditentukan lebih besar dari penunjuk terkelola lain yang ditentukan.

IsAddressLessThan<T>(T, T)

Mengembalikan nilai yang menunjukkan apakah penunjuk terkelola yang ditentukan kurang dari penunjuk terkelola lain yang ditentukan.

IsNullRef<T>(T)

Menentukan apakah penunjuk terkelola yang diberikan ke nilai jenis T adalah referensi null.

NullRef<T>()

Mengembalikan penunjuk terkelola null ke nilai tipe T.

Read<T>(Void*)

Membaca nilai jenis T dari lokasi yang diberikan.

ReadUnaligned<T>(Byte)

Membaca nilai jenis T dari alamat yang diberikan tanpa mengasumsikan keselarasan dependen arsitektur alamat sumber.

ReadUnaligned<T>(Void*)

Membaca nilai jenis T dari lokasi tertentu tanpa mengasumsikan keselarasan dependen arsitektur alamat sumber.

SizeOf<T>()

Mengembalikan ukuran nilai dari parameter jenis yang diberikan.

SkipInit<T>(T)

Melewati aturan penetapan yang pasti untuk referensi tertentu.

Subtract<T>(T, Int32)

Mengurangi offset dari pointer terkelola yang diberikan.

Subtract<T>(T, IntPtr)

Mengurangi offset elemen dari penunjuk terkelola yang diberikan.

Subtract<T>(T, UIntPtr)

Mengurangi offset elemen dari penunjuk terkelola yang diberikan.

Subtract<T>(Void*, Int32)

Mengurangi offset elemen dari penunjuk tidak terkelola yang diberikan.

SubtractByteOffset<T>(T, IntPtr)

Mengurangi offset byte dari pointer terkelola yang diberikan.

SubtractByteOffset<T>(T, UIntPtr)

Mengurangi offset byte dari pointer terkelola yang diberikan.

Unbox<T>(Object)

Mengembalikan mutable ref ke nilai berkotak.

Write<T>(Void*, T)

Menulis nilai jenis T ke lokasi yang diberikan.

WriteUnaligned<T>(Byte, T)

Menulis nilai jenis T ke lokasi yang diberikan tanpa mengasumsikan keselarasan dependen arsitektur alamat tujuan.

WriteUnaligned<T>(Void*, T)

Menulis nilai jenis T ke lokasi yang diberikan tanpa mengasumsikan keselarasan dependen arsitektur alamat tujuan.

Berlaku untuk