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 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 fordító módosítóként fogadja el a tagokat safe és az extern explicit elrendezésű mezőket. A frissített hívóbiztonsági szabályokra azonban még nincs nyilvánosan bejelentkezve, így a fordító nem kényszeríti ki a biztonsági beállításokat safe , és unsafe nem fejezi ki: ha mindkét módosítót kihagyja, az nem eredményez hibát, és egyik módosító sem módosítja a hívók által elvégezhető műveleteket. 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.

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:

// Compiles under LangVersion preview, but the safety choice isn't enforced 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 a frissített modellben, de a fordító még nem kényszeríti ki ezt a szabályt, mert nincs nyilvános jóváhagyás a frissített szabályokra.

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:

// Compiles under LangVersion preview, but the safety choice isn't enforced yet.
[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 a frissített modellben, de a fordító még nem kényszeríti ki ezt a szabályt.

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