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 numa estrutura com layout explícito. 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. O compilador aceita safe como modificador os extern membros e campos de layout explícito. No entanto, ainda não existe um opt-in público para as regras atualizadas de segurança do chamador, por isso o compilador não aplica a escolha de segurança that safe and unsafe express: omitir ambos os modificadores não produz erro, e nenhum dos modificadores altera o que os chamadores podem fazer. Para seguir a funcionalidade, defina a LangVersion opção do compilador para preview. 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:
// Compiles under LangVersion preview, but the safety choice isn't enforced yet.
[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. Omitir ambos os modificadores pretende ser um erro segundo o modelo atualizado, mas o compilador ainda não aplica essa regra porque não existe um opt-in público para as regras atualizadas.
Campos de layout explícito
Numa struct com [StructLayout(LayoutKind.Explicit)], os campos podem sobrepor-se na memória, pelo que o compilador não consegue raciocinar sobre se uma leitura num campo é correta. Assinalas todos os campos de tal estrutura ou safeunsafe:
// Compiles under LangVersion preview, but the safety choice isn't enforced yet.
[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. Tal como com extern os membros, omitir ambos os modificadores pretende ser um erro no modelo atualizado, mas o compilador ainda não aplica essa regra.
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.