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 kunt als wijzigingsfunctie toepassen safe op een declaratie die de compiler niet zelfstandig kan classificeren, zoals een extern lid of veld in een type met expliciete of uitgebreide 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. Stel LangVersion deze optie in om preview de syntaxis in te schakelen. Als u ook de bijgewerkte regels wilt afdwingen, inclusief expliciete safe of unsafe keuzes en onveilige aanroeperverplichtingen, schakelt u de updated-memory-safety-rules compilerfunctie in. Zie De bijgewerkte regels voor geheugenveiligheid inschakelen voor activeringsdetails. 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:
// 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 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. Als de bijgewerkte regels zijn ingeschakeld, is het weglaten van beide modifiers een fout.
Expliciete of uitgebreide indelingsvelden
In een type met [StructLayout(LayoutKind.Explicit)] of [ExtendedLayout]kan de compiler de veiligheid van elk exemplaarveld niet zelfstandig classificeren. U markeert elk dergelijk veld safe of 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;
}
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 Dezelfde regel geldt voor expliciete indelingsvelden en uitgebreide indelingsvelden. Net als bij extern leden is het weglaten van beide modifiers een fout wanneer de bijgewerkte regels zijn ingeschakeld.
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.