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 markerar en deklaration som inte kräver en unsafe kontext på dess användningsplats enligt den uppdaterade minnessäkerhetsmodellen. Modifieraren safe är motsvarigheten till unsafe. En osäker kontext krävs inte för anropare av en safe deklaration, samtidigt unsafe som skyldigheten att granska säkerheten sprids till anroparen.
För att använda själva nyckelordet safe krävs kompilatoralternativet AllowUnsafeBlocks (-unsafe), även om anropare inte behöver någon unsafe kontext. Vanliga deklarationer är säkra som standard, så utelämna safe där det inte krävs för att undvika onödiga krav på osäker kompilering.
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.
Tillåtna och obligatoriska deklarationer
Du kan tillämpa safe på deklarationer som tillåter en kräver osäker modifierare, inklusive metoder, konstruktorer, egenskaper och fält. För vanliga deklarationer kan modifieraren göra det avsedda kontraktet explicit, inklusive i källgenererad kod. Det är inte begränsat till extern medlemmar och layoutfält.
Vissa deklarationer kräver ett uttryckligt val av safe eller unsafe när de uppdaterade reglerna är aktiverade. I följande avsnitt beskrivs extern medlemmar och explicita eller utökade layoutfält.
Till skillnad från unsafeetablerar safe inte en lexikal kontext. Det gör inte osäkra åtgärder i en medlemstext säkra eller avbryter en omslutande osäker kontext. Du kan inte kombinera safe och unsafe modifierare i samma deklaration. Detta ger CS9388.
I nyare kompilatorer safe kräver AllowUnsafeBlocksdeklarationer också , även om anropare inte behöver en osäker kontext. Ange <AllowUnsafeBlocks>true</AllowUnsafeBlocks>cs9401 i projektfilen. Den här modifierarkontrollen är oberoende av den uppdaterade regeltillämpningen. Roslyn dokumenterar det som det introducerades i Visual Studio 2026 version 18.13, efter .NET 11.0.100; kompilatorn .NET 11 RC2 tillämpar inte detta krav för safe. Kompilatorgränsen och skillnaden från CS0227 för osäkra block finns i Osäkra kontextkrav.
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.
Använd samma modifierare för instansfält i typer med icke-zero StructLayoutAttribute.Pack eller StructLayoutAttribute.Size, inklusive sekventiell och automatisk layout. En sekventiell layouttyp med Pack = 1 kräver till exempel samma explicita val. Ospecificerade eller nollvärden utlöser inte den ytterligare regeln själva. Statiska och konstanta fält är undantagna. För syntetiserade bakgrundsfält placerar du modifieraren på den ägande egenskapen eller händelsen.
Cs9392-meddelandet och korrigeringar för annan syntetiserad lagring finns i Fältlayoutsäkerhet.
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.