safe (C#-Referenz)

Das safe kontextbezogene Schlüsselwort bestätigt, dass eine Deklaration an Orten klingt, an denen das aktualisierte Speichersicherheitsmodell erfordert, dass Sie die Sicherheitsauswahl explizit festlegen müssen. Sie wenden safe als Modifizierer für eine Deklaration an, die der Compiler nicht eigenständig klassifizieren kann, z. B. ein extern Element oder ein Feld in einem Typ mit explizitem oder erweitertem Layout. Der safe Modifizierer ist das Gegenstück zu unsafe: safe bestätigt, dass Aufrufer keinen unsafe Kontext benötigen, während unsafe die Verpflichtung zur Überwachung der Sicherheit an den Aufrufer weitergegeben wird.

Important

Das safe Schlüsselwort ist Teil des aktualisierten Speichersicherheitsmodells, eines Vorschaufeatures in C# 15 und .NET 11. Legen Sie diese Einstellung LangVersion fest, preview um die Syntax zu aktivieren. Aktivieren Sie das updated-memory-safety-rules Compilerfeature, um auch die aktualisierten Regeln zu erzwingen, einschließlich expliziter safe Oder unsafe Auswahlmöglichkeiten und nicht unsicherer Aufruferverpflichtungen. Details zur Aktivierung finden Sie unter Aktivieren der aktualisierten Speichersicherheitsregeln. Den vollständigen Entwurf finden Sie in der Spezifikation der Speichersicherheitsfeatures.

Externe Mitglieder

Ein extern Mitglied ruft systemeigenen Code auf, sodass der Compiler seine Sicherheit nicht klassifizieren kann. Unter dem aktualisierten Modell markieren Sie jede extern Deklaration, einschließlich einer LibraryImport partiellen Methode, entweder safe oder 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 akzeptiert keine Parameter und gibt einen Grundtyp zurück, sodass der Autor bestätigt, dass der Aufruf sicher ist, und Aufrufer verwenden ihn ohne Kontext unsafe . strlen verwendet einen unformatierten Zeiger, der vom systemeigenen Code abgeleitet wird unsafe , sodass die Deklaration die Verpflichtung an die Aufrufer weiterleitet und weiterleitet. Wenn die aktualisierten Regeln aktiviert sind, ist das Auslassen beider Modifizierer ein Fehler.

Explizite oder erweiterte Layoutfelder

In einem Typ mit [StructLayout(LayoutKind.Explicit)] oder [ExtendedLayout], kann der Compiler die Sicherheit jedes Instanzfelds nicht eigenständig klassifizieren. Sie markieren jedes solche Feld entweder safe oder 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;
}

Ein Feld, das einen systemeigenen Zeiger enthält oder dessen Typ andernfalls eine invariante Form des Typsystems enthält, ist unsafe. Ein Feld, dessen Typ vollständig vom Typsystem beschrieben wird safe. Die gleiche Regel gilt für explizite Layoutfelder und erweiterte Layoutfelder. Wie bei extern Mitgliedern ist das Auslassen beider Modifizierer ein Fehler, wenn die aktualisierten Regeln aktiviert sind.

C#-Sprachspezifikation

Weitere Informationen finden Sie unter "Unsicherer Code " in der C#-Sprachspezifikation. Die Sprachspezifikation ist die endgültige Quelle für C#-Syntax und -Verwendung.

Informationen zum Entwurf des aktualisierten Speichersicherheitsmodells finden Sie in der Spezifikation der Speichersicherheitsfunktion.

Siehe auch