safe (odwołanie w C#)

Kontekstowe safe słowo kluczowe świadczy o tym, że deklaracja brzmi w miejscach, w których zaktualizowany model bezpieczeństwa pamięci wymaga jawnego wyboru bezpieczeństwa. safe Stosujesz jako modyfikator w deklaracji, że kompilator nie może klasyfikować samodzielnie, na przykład extern elementu członkowskiego lub pola w strukturze z jawnym układem. Modyfikator safe jest odpowiednikiem unsafesafe : zaświadcza, że osoby wywołujące nie unsafe potrzebują kontekstu, a jednocześnie unsafe propaguje obowiązek inspekcji bezpieczeństwa obiektu wywołującego.

Ważna

Słowo safe kluczowe jest częścią zaktualizowanego modelu bezpieczeństwa pamięci, funkcji w wersji zapoznawczej w języku C# 15 i .NET 11. Kompilator w wersji .NET 11 (wersja zapoznawcza 5) nie rozpoznaje jeszcze słowa kluczowego. Aby postępować zgodnie z funkcją, ustaw opcję kompilatora LangVersion na previewwartość . Aby uzyskać pełny projekt, zobacz specyfikację funkcji bezpieczeństwa pamięci. Kod w tym artykule przedstawia proponowaną składnię i nie kompiluje się z bieżącym kompilatorem wersji zapoznawczej.

Członkowie extern

Element extern członkowski wywołuje kod natywny, więc kompilator nie może sklasyfikować jego bezpieczeństwa. W ramach zaktualizowanego modelu oznaczasz każdą extern deklarację, w tym metodę częściową LibraryImport lub 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 nie przyjmuje parametrów i zwraca element pierwotny, dlatego autor potwierdza, że wywołanie jest bezpieczne, a osoby wywołujące używają go bez unsafe kontekstu. strlen przyjmuje nieprzetworzone wskaźniki, że kod natywny wyłuska, więc deklaracja jest unsafe i propaguje obowiązek jego obiektów wywołujących. Pominięcie obu modyfikatorów jest błędem, który wymusza podjęcie decyzji o bezpieczeństwie.

Pola jawnego układu

W ramach struktury z polami [StructLayout(LayoutKind.Explicit)]mogą nakładać się na pamięć, więc kompilator nie może wnioskować, czy odczyt za pomocą jednego pola jest zdrowy. Każde pole takiej struktury oznacza lub safeunsafe:

// Preview
[StructLayout(LayoutKind.Explicit)]
internal struct Union
{
    [FieldOffset(0)]
    internal safe int AsInt;

    [FieldOffset(0)]
    internal safe float AsFloat;
}

Pole, które zawiera wskaźnik macierzysty lub którego typ w inny sposób niesie niezmienny system typów, nie może wyrazić, to unsafe. Pole, którego typ jest w pełni opisany przez system typów, to safe. Podobnie jak w przypadku extern elementów członkowskich pominięcie obu modyfikatorów jest błędem.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Niebezpieczny kod w specyfikacji języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Aby zapoznać się z projektem zaktualizowanego modelu bezpieczeństwa pamięci, zobacz specyfikację funkcji bezpieczeństwa pamięci.

Informacje dodatkowe