safe (Referência de C#)

A safe palavra-chave contextual atesta que uma declaração é sólida em locais em que o modelo de segurança de memória atualizado exige que você torne a escolha de segurança explícita. Você aplica safe como modificador em uma declaração que o compilador não pode classificar por conta própria, como um extern membro ou um campo em um tipo com layout explícito ou estendido. O safe modificador é o equivalente a unsafe: safe atesta que os chamadores não unsafe precisam de contexto, enquanto unsafe propaga a obrigação de auditar a segurança para o chamador.

Importante

A safe palavra-chave faz parte do modelo de segurança de memória atualizado, um recurso de visualização em C# 15 e .NET 11. Defina LangVersion para preview habilitar a sintaxe. Para também impor as regras atualizadas, incluindo opções ou unsafe opções explícitas safe e obrigações de chamador não seguras, habilite o recurso do updated-memory-safety-rules compilador. Para obter detalhes de ativação, consulte Habilitar as regras de segurança de memória atualizadas. Para obter o design completo, consulte a especificação do recurso de segurança de memória.

Membros extern

Um extern membro chama o código nativo para que o compilador não possa classificar sua segurança. No modelo atualizado, você marca todas as extern declarações, incluindo um LibraryImport método parcial, safe ou 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 não usa parâmetros e retorna um primitivo, portanto, o autor atesta que a chamada é segura e os chamadores a usam sem contexto unsafe . strlen usa um ponteiro bruto que o código nativo desreferencia, portanto, a declaração é unsafe e propaga a obrigação para seus chamadores. Com as regras atualizadas habilitadas, omitir ambos os modificadores é um erro.

Campos de layout explícitos ou estendidos

Em um tipo com [StructLayout(LayoutKind.Explicit)] ou [ExtendedLayout], o compilador não pode classificar a segurança de cada campo de instância por conta própria. Você marca cada campo desse tipo safe ou 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;
}

Um campo que contém um ponteiro nativo ou cujo tipo de outra forma carrega um invariável que o sistema de tipos não pode expressar é unsafe. Um campo cujo tipo é totalmente descrito pelo sistema de tipos é safe. A mesma regra se aplica a campos de layout explícito e campos de layout estendido. Assim como acontece com extern os membros, omitir ambos os modificadores é um erro quando as regras atualizadas estão habilitadas.

Especificação da linguagem C#

Para obter mais informações, consulte código não seguro na Especificação da Linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Para o design do modelo de segurança de memória atualizado, consulte a especificação do recurso de segurança de memória.

Consulte também