safe (C# referencia)

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.

Lásd még