Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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
- palavras-chave C#
- Palavra-chave
unsafe -
externmodificador - Código não seguro, tipos de ponteiro e ponteiros de função