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ó a deklarációt úgy jelöli meg, hogy a frissített memóriabiztonsági modell nem igényel unsafe kontextust a használat helyén. A safe módosító a megfelelője a unsafe. A deklaráció hívói safe számára nincs szükség nem biztonságos környezetre, miközben unsafe propagálja a biztonsági naplózási kötelezettséget a hívónak.
Magának a kulcsszónak a safe használatához szükség van a AllowUnsafeBlocks fordítóra (-unsafe), annak ellenére, hogy a hívóknak nincs szükségük kontextusra unsafe . A szokásos deklarációk alapértelmezés szerint biztonságosak, ezért ne safe kelljen ott tartózkodnia, ahol nincs szükség a szükségtelenül nem biztonságos fordításra.
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.
Engedélyezett és kötelező nyilatkozatok
Alkalmazhat safe olyan deklarációkat, amelyek nem biztonságos módosítók használatát teszik lehetővé, beleértve a metódusokat, konstruktorokat, tulajdonságokat és mezőket. A szokásos deklarációk esetében a módosító explicitvé teheti a kívánt szerződést, beleértve a forrás által generált kódot is. Ez nem korlátozódik a tagokra és az extern elrendezési mezőkre.
Bizonyos deklarációkhoz explicit választásra safe van szükség, vagy unsafe ha a frissített szabályok engedélyezve vannak. A következő szakaszok a tagokat és a explicit vagy kiterjesztett elrendezési mezőket ismertetik extern .
Ellentétben unsafea lexikális safe kontextussal. Nem teszi biztonságossá a tagtörzsben végzett nem biztonságos műveleteket, és nem szünteti meg a nem biztonságos környezetet. Nem kombinálhatja a módosítókat ugyanazon unsafe a safe deklaráción, így CS9388-at hoz létre.
Az újabb fordítók safe esetében a deklarációkra is szükség van AllowUnsafeBlocks, annak ellenére, hogy a hívóknak nincs szükségük nem biztonságos környezetre. Állítsa be <AllowUnsafeBlocks>true</AllowUnsafeBlocks> a projektfájlba a CS9401 feloldásához. Ez a módosító ellenőrzés független a frissített szabályok kikényszerítésére vonatkozó jóváhagyástól. A Roslyn a 2026-os Visual Studio 18.13-as verziójában bevezetett módon dokumentálja a 11.0.100-as .NET után; a .NET 11 RC2 fordító nem érvényesíti ezt a követelménytsafe. A fordítóhatár és a CS0227 nem biztonságos blokkok esetében való megkülönböztetése esetén lásd a nem biztonságos környezet követelményeit.
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.
Alkalmazza ugyanazokat a módosítókat a nemero StructLayoutAttribute.Pack vagy StructLayoutAttribute.Sizeaz automatikus elrendezést is tartalmazó típusok példánymezőire. Például egy szekvenciális elrendezésű típushoz Pack = 1 ugyanaz a explicit választás szükséges. A meghatározatlan vagy nulla értékek önmagukban nem aktiválják a további szabályt. A statikus és állandó mezők kivételt képeznek. Szintetizált háttérmezők esetén helyezze a módosítót a tulajdonos tulajdonságra vagy eseményre.
A CS9392-üzenet és az egyéb szintetizált tárterület javításaiért lásd a mezőelrendezés biztonságát.
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.