Unsafe Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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 |
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 |
BitCast<TFrom,TTo>(TFrom) |
Menginterpretasi ulang nilai jenis |
ByteOffset<T>(T, T) |
Menentukan offset byte dari asal ke target dari pointer terkelola yang diberikan. |
Copy<T>(T, Void*) |
Menyalin nilai jenis |
Copy<T>(Void*, T) |
Menyalin nilai jenis |
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 |
NullRef<T>() |
Mengembalikan penunjuk terkelola null ke nilai tipe |
Read<T>(Void*) |
Membaca nilai jenis |
ReadUnaligned<T>(Byte) |
Membaca nilai jenis |
ReadUnaligned<T>(Void*) |
Membaca nilai jenis |
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 |
Write<T>(Void*, T) |
Menulis nilai jenis |
WriteUnaligned<T>(Byte, T) |
Menulis nilai jenis |
WriteUnaligned<T>(Void*, T) |
Menulis nilai jenis |