aman (Referensi C#)

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 jenis dengan tata letak eksplisit atau diperluas. 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. Atur LangVersion ke preview untuk mengaktifkan sintaks. Untuk juga menerapkan aturan yang diperbarui, termasuk eksplisit safe atau unsafe pilihan dan memerlukan kewajiban penelepon yang tidak aman, aktifkan updated-memory-safety-rules fitur kompilator. Untuk detail aktivasi, lihat Mengaktifkan aturan keamanan memori yang diperbarui. Untuk desain lengkapnya, lihat spesifikasi fitur keamanan memori.

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:

// Syntax requires LangVersion preview; enforcement requires the updated-memory-safety-rules compiler feature.
[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. Dengan aturan yang diperbarui diaktifkan, menghilangkan kedua pengubah adalah kesalahan.

Bidang tata letak eksplisit atau diperluas

Dalam jenis dengan [StructLayout(LayoutKind.Explicit)] atau [ExtendedLayout], pengkompilasi tidak dapat mengklasifikasikan keamanan setiap bidang instans sendiri. Anda menandai setiap bidang tersebut baik safe atau unsafe:

// Syntax requires LangVersion preview; enforcement requires the updated-memory-safety-rules compiler feature.
[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. Aturan yang sama berlaku untuk bidang tata letak eksplisit dan bidang tata letak yang diperluas. Seperti halnya extern anggota, menghilangkan kedua pengubah adalah kesalahan ketika aturan yang diperbarui diaktifkan.

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.

Baca juga