Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.