inseguro (Referência C#)

A unsafe palavra-chave denota um contexto inseguro, que é necessário para qualquer operação que envolva ponteiros. Para obter mais informações, consulte Código e ponteiros não seguros.

A referência da linguagem C# documenta a versão mais recentemente lançada da linguagem C#. Contém também documentação inicial para funcionalidades em versões preliminares públicas para a próxima versão da linguagem.

A documentação identifica qualquer funcionalidade introduzida pela primeira vez nas últimas três versões da língua ou em pré-visualizações públicas atuais.

Sugestão

Para saber quando uma funcionalidade foi introduzida pela primeira vez em C#, consulte o artigo sobre o histórico de versões da linguagem C#.

Use o unsafe modificador na declaração de um tipo ou membro. Toda a extensão textual do tipo ou membro é um contexto inseguro. Por exemplo, o seguinte método é declarado com o unsafe modificador:

unsafe static void FastCopy(byte[] src, byte[] dst, int count)
{
    // Unsafe context: can use pointers here.
}

O âmbito do contexto inseguro estende-se da lista de parâmetros até ao fim do método, por isso também pode usar ponteiros na lista de parâmetros:

unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}

Também pode usar um bloco inseguro para permitir o uso de código inseguro dentro desse bloco. Por exemplo:

unsafe
{
    // Unsafe context: can use pointers here.
}

Para compilar código não seguro, você deve especificar a opção de compilador AllowUnsafeBlocks . O runtime da common language não consegue verificar código inseguro.

Note

A funcionalidade de pré-visualização de segurança de memória disponível em C# 15 restringe as operações que requerem contexto unsafe . Já não é necessário um unsafe contexto para criar um apontador, a fixed instrução, converter uma stackalloc expressão em apontador e usar sizeof num tipo não gerido. Apenas operações que acedem à memória apontada, como a indireção do ponteiro, ainda requerem um unsafe contexto. A mesma pré-visualização também adiciona um unsafe(expression) formulário que estabelece um contexto inseguro para uma única expressão, para posições onde um unsafe bloco não pode aparecer, como um inicializador de campo ou um catch filtro. Para mais informações, veja Expressões inseguras. A pré-visualização também dá um novo significado ao unsafe modificador num membro: o compilador reconhece-o como marcando o membro necessites-unsafe. A aplicação dessa obrigação pelo chamador ainda não está implementada, por isso marcar um membro unsafe atualmente não tem efeito sobre os seus chamadores. Para mais informações, veja Membros inseguros para o Chamador.

Exemplo

// compile with: -unsafe
class UnsafeTest
{
    // Unsafe method: takes pointer to int.
    unsafe static void SquarePtrParam(int* p)
    {
        *p *= *p;
    }

    unsafe static void Main()
    {
        int i = 5;
        // Unsafe method: uses address-of operator (&).
        SquarePtrParam(&i);
        Console.WriteLine(i);
    }
}
// Output: 25

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#.

Ver também