Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A safe környezetfüggő kulcsszó azt igazolja, hogy a deklaráció olyan helyeken működik, ahol a frissített memóriabiztonsági modell megköveteli, hogy a biztonsági választás egyértelmű legyen. Módosítóként alkalmazhatja safe azt a deklarációt, hogy a fordító nem tud önállóan besorolni, például egy extern tagot vagy egy explicit elrendezésű struktúra egyik mezőjét. A safe módosító a megfelelője a következőknek unsafe: safe igazolja, hogy a hívóknak nincs unsafe szükségük kontextusra, miközben unsafe propagálják a biztonsági naplózási kötelezettséget a hívónak.
Important
A safe kulcsszó a frissített memóriabiztonsági modell része, amely a C# 15 és .NET 11 előzetes verziója. A .NET 11 Preview 5 fordítója még nem ismeri fel a kulcsszót. A funkció követéséhez állítsa a LangVersion fordító beállítását a következőre preview: . A teljes kialakításért tekintse meg a memóriabiztonsági funkciók specifikációját. A cikkben szereplő kód a javasolt szintaxist mutatja be, és nem fordítja le az aktuális előzetes verziójú fordítóval.
Extern tagok
Egy extern tag natív kódba hív, így a fordító nem tudja besorolni a biztonságát. A frissített modellben minden extern deklarációt megjelölhet, beleértve egy részleges metódust LibraryImport is, vagy safeunsafe:
// 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 nem használ paramétereket, és primitív értéket ad vissza, így a szerző igazolja, hogy a hívás biztonságos, és a hívók környezet nélkül unsafe használják.
strlen a natív kód dereferensei nyers mutatót használnak, így a deklaráció unsafe a hívói kötelezettségét propagálja és propagálja. Mindkét módosító kihagyása hiba, ami arra kényszeríti, hogy a biztonsági döntést meghozhassa.
Explicit elrendezésű mezők
A strukturált [StructLayout(LayoutKind.Explicit)]szerkezetekben a mezők átfedhetik a memóriát, így a fordító nem tudja megállapítani, hogy az egyik mezőn keresztüli olvasás hang-e. Egy ilyen struktúra minden mezőjét megjelölheti vagy safeunsafe:
// Preview
[StructLayout(LayoutKind.Explicit)]
internal struct Union
{
[FieldOffset(0)]
internal safe int AsInt;
[FieldOffset(0)]
internal safe float AsFloat;
}
Az a mező, amely natív mutatót tartalmaz, vagy amelynek típusa egyébként invariáns, a típusrendszer nem fejezhető ki, az unsafe. Az a mező, amelynek típusát a típusrendszer safeteljes mértékben leírja. A tagokhoz extern hasonlóan mindkét módosító kihagyása hiba.
C# nyelvspecifikáció
További információ: Nem biztonságos kód a C# nyelvi specifikációjában. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.
A frissített memóriabiztonsági modell kialakításához tekintse meg a memóriabiztonsági funkció specifikációját.