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 typu s explicitním nebo rozšířený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. Nastavte LangVersion na preview povolení syntaxe. Pokud chcete také vynutit aktualizovaná pravidla, včetně explicitních safe nebo unsafe voleb a vyžaduje nebezpečné povinnosti volajícího, povolte funkci kompilátoru updated-memory-safety-rules . Podrobnosti o aktivaci najdete v tématu Povolení aktualizovaných pravidel zabezpečení paměti. Ú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:

// 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 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. Když jsou povolená aktualizovaná pravidla, vynechání obou modifikátorů je chyba.

Explicitní nebo rozšířená pole rozložení

V typu s [StructLayout(LayoutKind.Explicit)] nebo [ExtendedLayout]nemůže kompilátor klasifikovat bezpečnost každého pole instance samostatně. Každé takové pole označíte buď safe takto, nebo 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;
}

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é pravidlo platí pro pole explicitního rozložení a pole rozšířeného rozložení. Stejně jako u extern členů je vynechání obou modifikátorů chybou při povolení aktualizovaných pravidel.

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é