Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Контекстное safe ключевое слово подтверждает, что объявление звучит в местах, где обновленная модель безопасности памяти требует явного выбора безопасности. Вы применяете safe в качестве модификатора в объявлении, которое компилятор не может классифицировать самостоятельно, например extern элемент или поле в типе с явным или расширенным макетом. Модификатор safe является аналогом unsafe: safe указывает, что вызывающие не нуждаются unsafe в контексте, в то время как unsafe распространяет обязательство проверять безопасность вызывающей стороны.
Important
Ключевое safe слово является частью обновленной модели безопасности памяти, предварительной версии функции в C# 15 и .NET 11. Установите для LangVersionpreview включения синтаксиса. Чтобы также применить обновленные правила, включая явные safe или unsafe небезопасные обязательства вызывающего абонента, включите функцию updated-memory-safety-rules компилятора. Дополнительные сведения о активации см. в разделе "Включить обновленные правила безопасности памяти". Полный дизайн см. в спецификации функции безопасности памяти.
Экстерн-члены
Член вызывает машинный extern код, поэтому компилятор не может классифицировать его безопасность. В обновленной модели помечается каждое extern объявление, включая частичный LibraryImport метод, safe либо unsafe:
// 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 не принимает параметров и возвращает примитив, поэтому автор подтверждает, что вызов является безопасным, и вызывающие используют его без контекста unsafe .
strlen принимает необработанный указатель на то, что машинный код расшифровывается, поэтому объявление является unsafe и распространяет обязательство вызывающим его абонентам. При включении обновленных правил опущений оба модификатора являются ошибкой.
Явные или расширенные поля макета
В типе с [StructLayout(LayoutKind.Explicit)] или [ExtendedLayout], компилятор не может классифицировать безопасность каждого поля экземпляра самостоятельно. Помечаете каждое такое поле safe либо unsafe:
// 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;
}
Поле, которое содержит собственный указатель или тип которого в противном случае несет инвариантную систему типов, не может выразиться unsafe. Поле, тип которого полностью описан системой safeтипов. Это же правило применяется к полям явного макета и полям расширенного макета. Как и extern в случае с элементами, опущение обоих модификаторов является ошибкой при включении обновленных правил.
Спецификация языка C#
Дополнительные сведения см. в разделе " Небезопасный код " в спецификации языка C#. Спецификация языка является авторитетным источником синтаксиса и использования языка C#.
Сведения о проектировании обновленной модели безопасности памяти см. в спецификации функции безопасности памяти.