safe (Referenční dokumentace jazyka C#)

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 v .NET 11 Preview 5 zatím klíčové slovo nerozpozná. 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. Kód v tomto článku ukazuje navrženou syntaxi a nekopiluje se s aktuálním kompilátorem verze Preview.

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:

// 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 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 chyba, která vás přinutí učinit bezpečnostní rozhodnutí.

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:

// Preview
[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ů chyba.

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.

Viz také