Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bağlamsal safe anahtar sözcüğü, güncelleştirilmiş bellek güvenliği modeli altında kullanım sitesinde bir bağlam gerektirmeyen bir unsafe bildirimi işaretler.
safe Değiştirici, öğesine unsafekarşılık gelendir. Bir bildirimi arayanlar için güvenli olmayan bir safe bağlam gerekli değildir, ancak unsafe güvenliği arayana denetim yükümlülüğünü de yayılım.
Çağıranların bir unsafe bağlama ihtiyacı olmasa da, anahtar sözcüğün safeAllowUnsafeBlocks kendisini kullanmak için derleyici seçeneği ()-unsafe gerekir. Normal bildirimler varsayılan olarak güvenlidir, bu nedenle safe gereksiz yere güvenli olmayan derleme gerektirmekten kaçınmak için gerekli olmayan yerleri atlayın.
Important
safe anahtar sözcüğü, C# 15 ve .NET 11'deki bir önizleme özelliği olan güncelleştirilmiş bellek güvenliği modelinin bir parçasıdır.
preview Söz dizimini etkinleştirmek için olarak ayarlayınLangVersion. Ayrıca açık safe veya seçimler dahil unsafe güncelleştirilmiş kuralları zorunlu kılmak ve güvenli olmayan çağıran yükümlülüklerini zorunlu kılmak için derleyici özelliğini etkinleştirin updated-memory-safety-rules . Etkinleştirme ayrıntıları için bkz . Güncelleştirilmiş bellek güvenliği kurallarını etkinleştirme. Tam tasarım için bkz. bellek güvenliği özelliği belirtimi.
İzin verilen ve gerekli bildirimler
Yöntemler, oluşturucular, özellikler ve alanlar dahil olmak üzere güvenli olmayan bir değiştiriciye izin veren bildirimlere uygulayabilirsiniz safe . Normal bildirimler için, değiştirici kaynak tarafından oluşturulan kod dahil olmak üzere hedeflenen sözleşmeyi açık hale getirebilir. Üyeler ve düzen alanlarıyla extern sınırlı değildir.
Belirli bildirimler, güncelleştirilmiş kurallar etkinleştirildiğinde veya unsafe açık bir seçenek safe gerektirir. Aşağıdaki bölümlerde üyeler ve açık veya genişletilmiş düzen alanları açıklanmaktadır extern .
safe'nin aksine unsafesözcük bağlamı oluşturmaz. Üye gövdesindeki güvenli olmayan işlemleri güvenli yapmaz veya güvenli olmayan bağlamı iptal etmez. ve unsafe değiştiricilerini aynı bildirimde birleştiremezsinizsafe; bunu yaptığınızda CS9388 üretilir.
Extern üyeleri
Bir extern üye yerel kodu çağırır, böylece derleyici güvenliğini sınıflandıramaz. Güncelleştirilmiş modelin altında, kısmi bir extern yöntem LibraryImportsafede dahil olmak üzere veya olmak üzere her unsafe bildirimi işaretlersiniz:
// 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 parametre almaz ve bir ilkel değer döndürür, bu nedenle yazar çağrının güvenli olduğunu ve çağıranların bağlam olmadan unsafe kullandığını doğrular.
strlen yerel kodun başvurusunu kaldıran ham bir işaretçi alır, bu nedenle bildirimin olduğu unsafe ve çağıranlara yükümlülüğü yaydığını gösterir. Güncelleştirilmiş kurallar etkinleştirildiğinde, her iki değiştiricinin de atlanması bir hatadır.
Açık veya genişletilmiş düzen alanları
veya [ExtendedLayout]türünde [StructLayout(LayoutKind.Explicit)] derleyici, her örnek alanının güvenliğini kendi başına sınıflandıramaz. Bu tür her alanı safe veya unsafeişaretlersiniz:
// 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;
}
Yerel işaretçiyi tutan veya türü, tür sisteminin ifade emeyebileceği sabit bir değer taşıyan bir alandır unsafe. Türü tür sistemi tarafından tam olarak açıklanan bir alan şeklindedir safe. Aynı kural, açık düzen alanları ve genişletilmiş düzen alanları için de geçerlidir. Üyelerde extern olduğu gibi, güncelleştirilmiş kurallar etkinleştirildiğinde her iki değiştiricinin de atlanması bir hatadır.
C# dil belirtimi
Daha fazla bilgi için bkz. C# Dil Belirtimi'ndekiGüvenli olmayan kod. Dil belirtimi, C# söz dizimi ve kullanımı için kesin kaynaktır.
Güncelleştirilmiş bellek güvenliği modelinin tasarımı için bkz. bellek güvenliği özelliği belirtimi.