Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Kontextové safe klíčové slovo potvrzuje, že deklarace je zvuková na místech, kde aktualizovaný model bezpečnosti paměti vyžaduje, abyste zvolili bezpečnostní volbu explicitně. Použijete safe jako modifikátor deklarace, kterou kompilátor nemůže klasifikovat samostatně, například extern člen nebo pole ve struktuře s explicitním rozložením.
safe Modifikátorem je protistranaunsafe: safe ověřuje, že volající nepotřebují žádný unsafe kontext, zatímco unsafe šíří povinnost auditovat bezpečnost volajícího.
Important
Klíčové safe slovo je součástí aktualizovaného modelu zabezpečení paměti, funkce Preview v jazyce C# 15 a .NET 11. Kompilátor přijímá safe jako modifikátor pro extern členy a pole explicitního rozložení. Pro aktualizovaná pravidla zabezpečení volajícího ale zatím neexistuje žádná veřejná výslovný souhlas, takže kompilátor nevynucuje bezpečnostní volbu, která safe a unsafe vyjadřuje: Vynechání obou modifikátorů nevyvolá chybu a ani modifikátor nezmění, co můžou volající dělat. Chcete-li postupovat podle této funkce, nastavte možnost kompilátoru LangVersion na previewhodnotu . Úplný návrh najdete ve specifikaci funkce bezpečnosti paměti.
Extern členové
Člen extern volá nativní kód, takže kompilátor nemůže klasifikovat jeho bezpečnost. V rámci aktualizovaného modelu označíte každou extern deklaraci, včetně LibraryImport částečné metody, nebo safeunsafe:
// Compiles under LangVersion preview, but the safety choice isn't enforced yet.
[LibraryImport("libc")]
internal static safe partial int getpid();
[LibraryImport("libc", StringMarshalling = StringMarshalling.Utf8)]
internal static unsafe partial nint strlen(byte* str);
getpid nepřijímá žádné parametry a vrací primitivní hodnotu, takže autor ověřuje, že volání je bezpečné a volající ho používají bez unsafe kontextu.
strlen přebírá nezpracovaný ukazatel, který nativní kód dereferences, takže deklarace je unsafe a šíří povinnost svým volajícím. Vynechání obou modifikátorů je v aktualizovaném modelu chybou, ale kompilátor toto pravidlo zatím nevynucuje, protože pro aktualizovaná pravidla neexistuje žádná veřejná výslovný souhlas.
Pole explicitního rozložení
Ve struktuře s [StructLayout(LayoutKind.Explicit)]poli se pole můžou překrývat v paměti, takže kompilátor nemůže zdůvodnět, jestli je čtení jedním polem zvuk. Označíte každé pole takové struktury buď safe nebo unsafe:
// Compiles under LangVersion preview, but the safety choice isn't enforced yet.
[StructLayout(LayoutKind.Explicit)]
internal struct Union
{
[FieldOffset(0)]
internal safe int AsInt;
[FieldOffset(0)]
internal safe float AsFloat;
}
Pole, které obsahuje nativní ukazatel nebo jehož typ jinak nese invariantní systém typů nemůže vyjádřit, je unsafe. Pole, jehož typ je plně popsán systémem typů je safe. Stejně jako u extern členů je vynechání obou modifikátorů chybou v aktualizovaném modelu, ale kompilátor toto pravidlo zatím nevynucuje.
specifikace jazyka C#
Další informace naleznete v tématu Nebezpečný kód ve specifikaci jazyka C#. Specifikace jazyka je konečným zdrojem syntaxe a použití jazyka C#.
Návrh aktualizovaného modelu bezpečnosti paměti naleznete ve specifikaci funkce bezpečnosti paměti.