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 alkalmazza safe azt a deklarációt, hogy a fordító nem tud önállóan besorolni, például egy extern tagot vagy egy mezőt explicit vagy kiterjesztett elrendezésű típusban. 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 szintaxis engedélyezésére preview van beállítvaLangVersion. A frissített szabályok kényszerítéséhez, beleértve az explicit safe vagy unsafe választási lehetőségeket, valamint a nem biztonságos hívói kötelezettségeket, engedélyezze a updated-memory-safety-rules fordító funkciót. Az aktiválás részleteiért lásd : A frissített memóriabiztonsági szabályok engedélyezése. A teljes kialakításért tekintse meg a memóriabiztonsági funkciók specifikációját.
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:
// 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 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. Ha a frissített szabályok engedélyezve van, mindkét módosító kihagyása hiba.
Explicit vagy kiterjesztett elrendezési mezők
Egy olyan típusban, amelyben [StructLayout(LayoutKind.Explicit)] a fordító vagy [ExtendedLayout]a fordító nem tudja önállóan besorolni az egyes példánymezők biztonságát. Minden ilyen mezőt megjelölhet vagy safeunsafe:
// 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;
}
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. Ugyanez a szabály vonatkozik az explicit elrendezésű mezőkre és a kiterjesztett elrendezésű mezőkre is. A tagokhoz extern hasonlóan mindkét módosító kihagyása hiba, ha a frissített szabályok engedélyezve vannak.
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.