safe (C#-referens)

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 modifierare på en deklaration som kompilatorn inte kan klassificera på egen hand, till exempel en extern medlem eller ett fält i en typ med explicit eller utökad 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. Ange LangVersion till för att preview aktivera syntaxen. Aktivera kompileringsfunktionen för att även framtvinga de uppdaterade reglerna, inklusive explicita safe eller unsafe val och krav på osäkra uppringningsskyldigheter updated-memory-safety-rules . Aktiveringsinformation finns i Aktivera de uppdaterade minnessäkerhetsreglerna. Fullständig design finns i specifikationen för minnessäkerhetsfunktioner.

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:

// 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 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. När de uppdaterade reglerna är aktiverade är det ett fel att utelämna båda modifierarna.

Explicita eller utökade layoutfält

I en typ med [StructLayout(LayoutKind.Explicit)] eller [ExtendedLayout]kan kompilatorn inte klassificera varje instansfälts säkerhet på egen hand. Du markerar alla sådana fält antingen safe eller 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;
}

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. Samma regel gäller för explicita layoutfält och fält med utökad layout. Precis som med extern medlemmar är det ett fel att utelämna båda modifierarna när de uppdaterade reglerna är aktiverade.

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.

Se även