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 akceptuje safe jako modyfikator pól extern elementów członkowskich i jawnego układu. Jednak nie ma jeszcze publicznej zgody na zaktualizowane reguły bezpieczeństwa wywołującego, więc kompilator nie wymusza wyboru bezpieczeństwa, który safe i unsafe wyraża: pominięcie obu modyfikatorów nie powoduje błędu, a żadna modyfikator nie zmienia tego, co mogą zrobić osoby wywołujące. Aby postępować zgodnie z funkcją, ustaw opcję kompilatora LangVersion na previewwartość . Aby uzyskać pełny projekt, zobacz specyfikację funkcji bezpieczeństwa pamięci.

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:

// 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 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 ma być błędem w zaktualizowanym modelu, ale kompilator nie wymusza jeszcze tej reguły, ponieważ nie ma publicznej zgody na zaktualizowane reguły.

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:

// 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;
}

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 ma być błędem w zaktualizowanym modelu, ale kompilator nie wymusza jeszcze tej reguły.

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