Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det safe kontextuella nyckelordet intygar att en deklaration är sund på platser där den uppdaterade minnessäkerhetsmodellen kräver att du gör säkerhetsvalet explicit. Du tillämpar safe som en modifierare på en deklaration som kompilatorn inte kan klassificera på egen hand, till exempel en extern medlem eller ett fält i en struct med explicit layout. Modifieraren safe är motsvarigheten till unsafe: safe intygar att anropare inte behöver något unsafe sammanhang, samtidigt unsafe som skyldigheten att granska säkerheten sprids till anroparen.
Important
Nyckelordet safe är en del av den uppdaterade minnessäkerhetsmodellen, en förhandsgranskningsfunktion i C# 15 och .NET 11. Kompilatorn i .NET 11 Preview 5 känner ännu inte igen nyckelordet. Om du vill följa funktionen anger du kompilatoralternativet LangVersion till preview. Fullständig design finns i specifikationen för minnessäkerhetsfunktioner. Koden i den här artikeln visar den föreslagna syntaxen och kompileras inte med den aktuella förhandsgranskningskompilatorn.
Externa medlemmar
En extern medlem anropar inbyggt kod så att kompilatorn inte kan klassificera sin säkerhet. Under den uppdaterade modellen markerar du varje extern deklaration, inklusive en LibraryImport partiell metod, antingen safe eller unsafe:
// 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 tar inga parametrar och returnerar en primitiv, så författaren intygar att anropet är säkert och anropare använder det utan kontext unsafe .
strlen tar en rådatapekare att den interna koden avrefererar, så deklarationen är unsafe och sprider skyldigheten till sina anropare. Att utelämna båda modifierarna är ett fel, vilket tvingar dig att fatta säkerhetsbeslutet.
Fält med explicit layout
I en struct med [StructLayout(LayoutKind.Explicit)]kan fält överlappa i minnet, så kompilatorn kan inte resonera om en läsning via ett fält är ljud. Du markerar varje fält i en sådan struct antingen safe eller unsafe:
// Preview
[StructLayout(LayoutKind.Explicit)]
internal struct Union
{
[FieldOffset(0)]
internal safe int AsInt;
[FieldOffset(0)]
internal safe float AsFloat;
}
Ett fält som innehåller en inbyggd pekare, eller vars typ annars har en invariant som typsystemet inte kan uttrycka, är unsafe. Ett fält vars typ beskrivs fullständigt av typsystemet är safe. Precis som med extern medlemmar är det ett fel att utelämna båda modifierarna.
Språkspecifikation för C#
Mer information finns i Osäker kod i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.
Information om hur du utformar den uppdaterade minnessäkerhetsmodellen finns i specifikationen för minnessäkerhetsfunktionen.