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

Warning

Jenis ini ditujukan untuk skenario manipulasi pointer tingkat lanjut. Penelepon diasumsikan terbiasa 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 menekan pemeriksaan keamanan jenis khas .NET untuk memenuhi tujuan performa mereka.

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

Note

Contoh-contoh ini ada hanya untuk tujuan demonstrasi. Dalam aplikasi dunia nyata, pengembang harus menggunakan fungsi pembantu seperti Reverse, yang lebih baik dioptimalkan daripada bahkan contoh-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 memasukkan 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 legal. Penyalahgunaan API ini dapat menyebabkan pelanggaran akses, membuat lubang GC, menghasilkan codegen yang salah, atau menginduksi perilaku yang tidak terdefinisi dan merusak dalam runtime .NET.

Metode

Nama Deskripsi
Add<T>(T, Int32)

Menambahkan offset ke penunjuk terkelola yang diberikan.

Add<T>(T, IntPtr)

Menambahkan offset elemen ke pointer terkelola yang diberikan.

Add<T>(T, UIntPtr)

Menambahkan offset elemen ke pointer terkelola yang diberikan.

Add<T>(Void*, Int32)

Menambahkan offset elemen ke penunjuk tidak terkelola yang diberikan.

AddByteOffset<T>(T, IntPtr)

Menambahkan offset byte ke pointer terkelola yang diberikan.

AddByteOffset<T>(T, UIntPtr)

Menambahkan offset byte ke pointer 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)

Meninterpretir kembali 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)

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

ByteOffset<T>(T, T)

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

Copy<T>(T, Void*)

Menyalin nilai jenis T ke lokasi yang diberikan.

Copy<T>(Void*, T)

Menyalin nilai jenis T ke lokasi yang diberikan.

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 dependen arsitektur alamat.

CopyBlockUnaligned(Void*, Void*, UInt32)

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

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 pointer terkelola yang ditentukan lebih besar dari pointer terkelola lain yang ditentukan.

IsAddressGreaterThanOrEqualTo<T>(T, T)

Menentukan apakah alamat memori yang dirujuk oleh left lebih besar dari atau sama dengan alamat memori yang dirujuk oleh right.

IsAddressLessThan<T>(T, T)

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

IsAddressLessThanOrEqualTo<T>(T, T)

Menentukan apakah alamat memori yang dirujuk oleh left kurang dari atau sama dengan alamat memori yang dirujuk oleh right.

IsNullRef<T>(T)

Menentukan apakah penunjuk terkelola tertentu 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 yang diberikan tanpa mengasumsikan keselarasan dependen arsitektur alamat sumber.

SizeOf<T>()

Mengembalikan ukuran nilai parameter jenis yang diberikan.

SkipInit<T>(T)

Melewati aturan penetapan pasti untuk referensi tertentu.

Subtract<T>(T, Int32)

Mengurangi offset dari pointer terkelola yang diberikan.

Subtract<T>(T, IntPtr)

Mengurangi offset elemen dari pointer terkelola yang diberikan.

Subtract<T>(T, UIntPtr)

Mengurangi offset elemen dari pointer 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