Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kata safe kunci kontekstual membuktikan bahwa deklarasi terdengar di tempat-tempat di mana model keamanan memori yang diperbarui mengharuskan Anda untuk membuat pilihan keamanan menjadi eksplisit. Anda menerapkan safe sebagai pengubah pada deklarasi bahwa pengkompilasi tidak dapat mengklasifikasikan sendiri, seperti extern anggota atau bidang dalam struktur dengan tata letak eksplisit. Pengubah safe adalah mitra untuk unsafe: safe membuktikan bahwa penelepon tidak unsafe memerlukan konteks, sambil unsafe menyebarluaskan kewajiban untuk mengaudit keamanan kepada pemanggil.
Important
Kata safe kunci adalah bagian dari model keamanan memori yang diperbarui, fitur pratinjau di C# 15 dan .NET 11. Pengkompilasi di .NET 11 Pratinjau 5 belum mengenali kata kunci. Untuk mengikuti fitur, atur LangVersion opsi pengkompilasi ke preview. Untuk desain lengkapnya, lihat spesifikasi fitur keamanan memori. Kode dalam artikel ini memperlihatkan sintaks yang diusulkan dan tidak dikompilasi dengan pengkompilasi pratinjau saat ini.
Anggota ekstern
Anggota extern memanggil kode asli, sehingga pengkompilasi tidak dapat mengklasifikasikan keamanannya. Di bawah model yang diperbarui, Anda menandai setiap extern deklarasi, termasuk LibraryImport metode parsial, baik safe atau unsafe:
// Preview: illustrates the updated model, which the current compiler doesn't enforce yet.
[LibraryImport("libc")]
internal static safe partial int getpid();
[LibraryImport("libc", StringMarshalling = StringMarshalling.Utf8)]
internal static unsafe partial nint strlen(byte* str);
getpid tidak mengambil parameter dan mengembalikan primitif, sehingga penulis membuktikan bahwa panggilan aman, dan penelepon menggunakannya tanpa unsafe konteks.
strlen mengambil pointer mentah yang dereferensi kode asli, sehingga deklarasinya adalah unsafe dan menyebarluaskan kewajiban kepada pemanggilnya. Menghilangkan kedua pengubah adalah kesalahan, yang memaksa Anda untuk membuat keputusan keamanan.
Bidang tata letak eksplisit
Dalam struktur dengan [StructLayout(LayoutKind.Explicit)], bidang dapat tumpang tindih dalam memori, sehingga pengkompilasi tidak dapat beralasan tentang apakah membaca melalui satu bidang adalah suara. Anda menandai setiap bidang struct tersebut baik safe atau unsafe:
// Preview
[StructLayout(LayoutKind.Explicit)]
internal struct Union
{
[FieldOffset(0)]
internal safe int AsInt;
[FieldOffset(0)]
internal safe float AsFloat;
}
Bidang yang menyimpan pointer asli, atau yang jenisnya membawa invarian yang tidak dapat diekspresikan oleh sistem jenis, adalah unsafe. Bidang yang jenisnya sepenuhnya dijelaskan oleh sistem jenis adalah safe. Seperti halnya extern anggota, menghilangkan kedua pengubah adalah kesalahan.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat Kode tidak aman di Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.
Untuk desain model keamanan memori yang diperbarui, lihat spesifikasi fitur keamanan memori.