Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om 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. De compiler accepteert safe als wijzigingsfunctie voor extern leden en velden met expliciete indeling. Er is echter nog geen openbare opt-in voor de bijgewerkte regels voor beller-veiligheid, dus de compiler dwingt de veiligheidskeuze niet af dat safe en unsafe express: het weglaten van beide modifiers levert geen fout op, en geen van beide wijzigingswijzigingen wat bellers kunnen doen. Als u de functie wilt volgen, stelt u de LangVersion compileroptie in op preview. Zie de specificatie van de geheugenveiligheidsfunctie voor het volledige ontwerp.
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:
// 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 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 bedoeld als een fout onder het bijgewerkte model, maar de compiler dwingt deze regel nog niet af omdat er geen openbare opt-in is voor de bijgewerkte regels.
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:
// 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;
}
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 bedoeld als een fout onder het bijgewerkte model, maar de compiler dwingt die regel nog niet af.
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.