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 marca uma declaração como não necessitando de contexto unsafe no seu local de utilização sob o modelo de segurança de memória atualizado. O safe modificador é o equivalente a unsafe. Não é necessário um contexto inseguro para quem chama de uma safe declaração, enquanto unsafe propaga a obrigação de auditar a segurança para o interlocutor.
Usar a safe própria palavra-chave requer a AllowUnsafeBlocks opção do compilador (-unsafe), embora os chamadores não precisem de unsafe contexto. Declarações ordinárias são seguras por defeito, por isso omitam safe onde não é necessário para evitar a necessidade desnecessária de compilação insegura.
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.
Declarações permitidas e exigidas
Pode candidatar-se safe a declarações que permitam um modificador de exiges-unsafe, incluindo métodos, construtores, propriedades e campos. Para declarações ordinárias, o modificador pode tornar explícito o contrato pretendido, incluindo no código gerado pela fonte. Não se limita a extern membros e campos de layout.
Certas declarações exigem uma escolha explícita de safe ou unsafe quando as regras atualizadas estão ativadas. As secções seguintes descrevem extern membros e campos de layout explícitos ou estendidos.
Ao contrário unsafede , safe não estabelece um contexto lexical. Não torna seguras operações inseguras num organismo membro nem cancela um contexto inseguro envolvente. Não podes combinar os safe modificadores e unsafe na mesma declaração; ao fazê-lo, produz CS9388.
Em compiladores mais recentes, safe as declarações também exigem AllowUnsafeBlocks, embora os chamadores não precisem de um contexto inseguro. Define <AllowUnsafeBlocks>true</AllowUnsafeBlocks> no teu ficheiro de projeto a resolução do CS9401. Esta verificação de modificadores é independente da opção de aplicação das regras atualizadas. O Roslyn documenta-o conforme introduzido no Visual Studio 2026 versão 18.13, após o .NET 11.0.100; o compilador .NET 11 RC2 não aplica este requisito para safe. Para a fronteira do compilador e a distinção em relação ao CS0227 em blocos inseguros, veja Requisitos de contexto inseguro.
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.
Aplique os mesmos modificadores a campos de instância em tipos com não nulo StructLayoutAttribute.Pack ou StructLayoutAttribute.Size, incluindo layout sequencial e automático. Por exemplo, um tipo de layout sequencial com Pack = 1 requer a mesma escolha explícita. Valores não especificados ou zero não ativam a regra adicional por si só. Campos estáticos e constantes estão isentos. Para campos de suporte sintetizados, coloque o modificador na propriedade ou evento proprietário.
Para a mensagem CS9392 e correções para outros armazenamentos sintetizados, veja Segurança do layout do campo.
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.