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 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.