Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Het safe contextuele trefwoord verklaart dat een declaratie klinkt op plaatsen waar het bijgewerkte model voor geheugenveiligheid vereist dat u de veiligheidskeuze expliciet maakt. U past safe zich toe als een wijzigingsfunctie voor een declaratie die de compiler niet zelfstandig kan classificeren, zoals een extern lid of een veld in een struct met expliciete indeling. De safe wijzigingsfunctie is de tegenhanger voor unsafe: safe verklaart dat bellers geen unsafe context nodig hebben, terwijl unsafe de verplichting om de veiligheid van de beller te controleren wordt doorgegeven.
Important
Het safe trefwoord maakt deel uit van het bijgewerkte model voor geheugenveiligheid, een preview-functie in C# 15 en .NET 11. Het trefwoord wordt nog niet herkend door de compiler in .NET 11 preview 5. Als u de functie wilt volgen, stelt u de LangVersion compileroptie in op preview. Zie de specificatie van de geheugenveiligheidsfunctie voor het volledige ontwerp. De code in dit artikel bevat de voorgestelde syntaxis en compileert niet met de huidige preview-compiler.
Extern leden
Een extern lid roept systeemeigen code aan, zodat de compiler de veiligheid niet kan classificeren. Onder het bijgewerkte model markeert u elke extern declaratie, inclusief een LibraryImport gedeeltelijke methode, safe of 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 neemt geen parameters en retourneert een primitieve, dus de auteur bevestigt dat de aanroep veilig is en bellers gebruiken deze zonder context unsafe .
strlen neemt een onbewerkte aanwijzer op dat de systeemeigen codededucties, dus de declaratie is unsafe en de verplichting doorgeeft aan zijn bellers. Het weglaten van beide modifiers is een fout, waardoor u de veiligheidsbeslissing moet nemen.
Velden met expliciete indeling
In een struct met [StructLayout(LayoutKind.Explicit)]kunnen velden overlappen in het geheugen, zodat de compiler niet kan redeneren of een doorgelezen veld geluid is. U markeert elk veld van een dergelijke struct safe of unsafe:
// Preview
[StructLayout(LayoutKind.Explicit)]
internal struct Union
{
[FieldOffset(0)]
internal safe int AsInt;
[FieldOffset(0)]
internal safe float AsFloat;
}
Een veld dat een systeemeigen aanwijzer bevat of waarvan het type anderszins een invariant bevat die het typesysteem niet kan uitdrukken, is unsafe. Een veld waarvan het type volledig wordt beschreven door het typesysteem.safe Net als bij extern leden is het weglaten van beide modifiers een fout.
C#-taalspecificatie
Zie Onveilige code in de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.
Zie de specificatie van de functie voor geheugenveiligheid voor het ontwerp van het bijgewerkte model voor geheugenveiligheid.