Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A safe palavra-chave contextual atesta que uma declaração é válida em locais onde o modelo de segurança de memória atualizado exige que a escolha de segurança seja explícita. Aplica-se safe como modificador numa declaração que o compilador não pode classificar sozinho, como um extern membro ou um campo num tipo com layout explícito ou estendido. O safe modificador é o contraponto a unsafe: safe atesta que os chamadores não unsafe necessitam de contexto, enquanto unsafe propaga a obrigação de auditar a segurança ao chamador.
Importante
A safe palavra-chave faz parte do modelo atualizado de segurança de memória, uma funcionalidade de pré-visualização em C# 15 e .NET 11. Definir LangVersion para preview ativar a sintaxe. Para também fazer cumprir as regras atualizadas, incluindo safe as obrigações de chamadas explícitas unsafe de escolhas e requisitos inseguros, ative a updated-memory-safety-rules funcionalidade do compilador. Para detalhes de ativação, consulte Ativar as regras de segurança de memória atualizadas. Para o design completo, consulte a especificação da funcionalidade de segurança da memória.
Membros externos
Um membro liga extern para código nativo, por isso o compilador não pode classificar a sua segurança. No modelo atualizado, assinala cada extern declaração, incluindo um LibraryImport método parcial, ou 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 toma parâmetros e retorna uma primitiva, pelo que o autor atesta que a chamada é segura e que os chamadores usam-na sem contexto unsafe .
strlen toma um ponteiro bruto que o código nativo desreferencia, por isso a declaração é unsafe e propaga a obrigação aos seus chamadores. Com as regras atualizadas ativadas, omitir ambos os modificadores é um erro.
Campos de layout explícitos ou estendidos
Num tipo com [StructLayout(LayoutKind.Explicit)] ou [ExtendedLayout], o compilador não consegue classificar a segurança de todos os campos de instância por si só. Assinala todos esses campos ou 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;
}
Um corpo que contém um ponteiro nativo, ou cujo tipo de outra forma contém um invariante que o sistema de tipos não consegue expressar, é unsafe. Um corpo cujo tipo é totalmente descrito pelo sistema de tipos é safe. A mesma regra aplica-se a campos de layout explícito e campos de layout estendido. Tal como nos extern membros, omitir ambos os modificadores é um erro quando as regras atualizadas estão ativadas.
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 do C#.
Para o design do modelo atualizado de segurança de memória, consulte a especificação da característica de segurança de memória.