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 typie z jawnym lub rozszerzonym 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. Ustaw LangVersion wartość na , aby preview włączyć składnię. Aby również wymusić zaktualizowane reguły, w tym jawne safe lub unsafe wybory i wymaga niebezpiecznych zobowiązań wywołujących, włącz funkcję kompilatora updated-memory-safety-rules . Aby uzyskać szczegółowe informacje na temat aktywacji, zobacz Włączanie zaktualizowanych reguł bezpieczeństwa pamięci. 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:
// Syntax requires LangVersion preview; enforcement requires the updated-memory-safety-rules compiler feature.
[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. Po włączeniu zaktualizowanych reguł pomijanie obu modyfikatorów jest błędem.
Jawne lub rozszerzone pola układu
W typie z elementem [StructLayout(LayoutKind.Explicit)] lub [ExtendedLayout]kompilator nie może samodzielnie sklasyfikować bezpieczeństwa każdego pola wystąpienia. Oznaczasz każde takie pole lub safeunsafe:
// Syntax requires LangVersion preview; enforcement requires the updated-memory-safety-rules compiler feature.
[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. Ta sama reguła ma zastosowanie do pól jawnego układu i pól układu rozszerzonego. Podobnie jak w przypadku extern elementów członkowskich pominięcie obu modyfikatorów jest błędem po włączeniu zaktualizowanych reguł.
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.