Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 einer Struktur mit explizitem 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. Der Compiler akzeptiert safe als Modifizierer für extern Member und explizite Layoutfelder. Es gibt jedoch keine öffentliche Zustimmung für die aktualisierten Aufrufersicherheitsregeln, sodass der Compiler die Sicherheitsauswahl nicht erzwingt und safeunsafe ausdrücket: Das Weglassen beider Modifizierer erzeugt keinen Fehler, und keine Modifizierer ändern, was Aufrufer tun können. Um dem Feature zu folgen, legen Sie die LangVersion Compileroption auf preview. 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:
// 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 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. Das Auslassen beider Modifizierer ist ein Fehler unter dem aktualisierten Modell, aber der Compiler erzwingt diese Regel noch nicht, da keine öffentliche Zustimmung für die aktualisierten Regeln vorhanden ist.
Explizite Layoutfelder
In einer Struktur mit [StructLayout(LayoutKind.Explicit)], Felder können sich im Arbeitsspeicher überlappen, sodass der Compiler nicht darüber nachdenken kann, ob ein Durchlesen eines Felds sound ist. Sie markieren jedes Feld einer solchen Struktur entweder safe oder 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;
}
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. Wie bei extern Mitgliedern ist das Weglassen beider Modifizierer ein Fehler unter dem aktualisierten Modell, aber der Compiler erzwingt diese Regel noch nicht.
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.