Unsafe Classe

Definição

Contém funcionalidade genérica de baixo nível para manipular ponteiros gerenciados e não gerenciados.

public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
Herança
Unsafe

Comentários

Warning

Esse tipo destina-se a cenários avançados de manipulação de ponteiro. Supõe-se que os chamadores estejam familiarizados com o ECMA-335, o S. II.14.4 e o III.1.1.5 e com o Adendo de Especificação da CLI ECMA-335.

A maioria das APIs desse tipo não executa nenhuma verificação ou validação de argumentos. O uso incorreto dessas APIs pode corromper a memória do processo ou desestabilizar o runtime .NET.

Esse tipo normalmente é usado por autores de biblioteca de baixo nível que desejam escrever código de alto desempenho e estão dispostos a suprimir as verificações típicas de segurança de tipo de .NET para atender às suas metas de desempenho.

Considere o exemplo a seguir, que inverte os elementos em um Span<T>.

Note

Esses exemplos existem simplesmente para fins de demonstração. Em aplicativos do mundo real, os desenvolvedores devem, em vez disso, usar funções auxiliares como Reverse, que são mais otimizadas do que até mesmo esses exemplos.

// A safe, verifiable way to reverse a Span<T>.
static void Reverse<T>(Span<T> span)
{
 while (span.Length > 1)
 {
   T firstElement = span[0];
   T lastElement = span[^1];
   span[0] = lastElement;
   span[^1] = firstElement;
   span = span[1..^1];
 }
}

Esse método é totalmente seguro de tipo e o runtime do .NET pode inserir verificações de limites para ajudar a impor a segurança. No entanto, os autores de biblioteca de baixo nível podem querer suprimir as verificações de segurança normais de .NET para melhorar o desempenho de seu próprio código. Esses desenvolvedores normalmente dependem de ferramentas de análise estática ou de suas próprias revisões de código para ajudar a impor a correção. As Unsafe APIs permitem que um desenvolvedor reescreva esse código usando constructos não verificáveis, como mostra o exemplo a seguir.

// A correct but unverifiable way to reverse a Span<T>.
static void Reverse<T>(Span<T> span)
{
 if (span.Length > 1)
 {
   ref T refLeft = ref MemoryMarshal.GetReference(span);
   ref T refRight = ref Unsafe.Add(ref refLeft, span.Length - 1);
   do
   {
     T leftElement = refLeft;
     T rightElement = refRight;
     refLeft = rightElement;
     refRight = leftElement;
     refLeft = ref Unsafe.Add(ref refLeft, 1);
     refRight = ref Unsafe.Subtract(ref refRight, 1);
   } while (Unsafe.IsAddressLessThan(ref refLeft, ref refRight));
 }
}

Como as Unsafe APIs suprimem a validação típica de segurança de tipo, cabe aos chamadores garantir que o código que estão escrevendo seja legal. O uso indevido dessas APIs pode causar violações de acesso, criar buracos de GC, produzir codegen incorreto ou induzir comportamentos indefinidos e desestabilizadores dentro do runtime .NET.

Métodos

Nome Description
Add<T>(T, Int32)

Adiciona um deslocamento ao ponteiro gerenciado fornecido.

Add<T>(T, IntPtr)

Adiciona um deslocamento de elemento ao ponteiro gerenciado fornecido.

Add<T>(T, UIntPtr)

Adiciona um deslocamento de elemento ao ponteiro gerenciado fornecido.

Add<T>(Void*, Int32)

Adiciona um deslocamento de elemento ao ponteiro não gerenciado fornecido.

AddByteOffset<T>(T, IntPtr)

Adiciona um deslocamento de bytes ao ponteiro gerenciado fornecido.

AddByteOffset<T>(T, UIntPtr)

Adiciona um deslocamento de bytes ao ponteiro gerenciado fornecido.

AreSame<T>(T, T)

Determina se os ponteiros gerenciados especificados apontam para o mesmo local.

As<T>(Object)

Converte o objeto fornecido no tipo especificado.

As<TFrom,TTo>(TFrom)

Reinterpreta o ponteiro gerenciado fornecido como um novo ponteiro gerenciado para um valor do tipo TTo.

AsPointer<T>(T)

Converte um ponteiro gerenciado em um ponteiro não gerenciado.

AsRef<T>(T)

Reinterpreta a referência somente leitura fornecida como uma referência mutável.

AsRef<T>(Void*)

Converte um ponteiro não gerenciado em um ponteiro gerenciado em um valor do tipo T.

BitCast<TFrom,TTo>(TFrom)

Reinterpreta o valor fornecido do tipo TFrom como um valor do tipo TTo.

ByteOffset<T>(T, T)

Determina o deslocamento de bytes da origem para o destino dos ponteiros gerenciados fornecidos.

Copy<T>(T, Void*)

Copia um valor do tipo T para o local fornecido.

Copy<T>(Void*, T)

Copia um valor do tipo T para o local fornecido.

CopyBlock(Byte, Byte, UInt32)

Copia bytes do endereço de origem para o endereço de destino.

CopyBlock(Void*, Void*, UInt32)

Copia bytes do endereço de origem para o endereço de destino.

CopyBlockUnaligned(Byte, Byte, UInt32)

Copia bytes do endereço de origem para o endereço de destino sem assumir o alinhamento dependente da arquitetura dos endereços.

CopyBlockUnaligned(Void*, Void*, UInt32)

Copia bytes do endereço de origem para o endereço de destino sem assumir o alinhamento dependente da arquitetura dos endereços.

InitBlock(Byte, Byte, UInt32)

Inicializa um bloco de memória no local fornecido com um determinado valor inicial.

InitBlock(Void*, Byte, UInt32)

Inicializa um bloco de memória no local fornecido com um determinado valor inicial.

InitBlockUnaligned(Byte, Byte, UInt32)

Inicializa um bloco de memória no local determinado com um determinado valor inicial sem assumir o alinhamento dependente da arquitetura do endereço.

InitBlockUnaligned(Void*, Byte, UInt32)

Inicializa um bloco de memória no local determinado com um determinado valor inicial sem assumir o alinhamento dependente da arquitetura do endereço.

IsAddressGreaterThan<T>(T, T)

Retorna um valor que indica se um ponteiro gerenciado especificado é maior que outro ponteiro gerenciado especificado.

IsAddressGreaterThanOrEqualTo<T>(T, T)

Determina se o endereço de memória referenciado é left maior ou igual ao endereço de memória referenciado por right.

IsAddressLessThan<T>(T, T)

Retorna um valor que indica se um ponteiro gerenciado especificado é menor que outro ponteiro gerenciado especificado.

IsAddressLessThanOrEqualTo<T>(T, T)

Determina se o endereço de memória referenciado é left menor ou igual ao endereço de memória referenciado por right.

IsNullRef<T>(T)

Determina se um determinado ponteiro gerenciado para um valor de tipo T é uma referência nula.

NullRef<T>()

Retorna um ponteiro gerenciado nulo para um valor do tipo T.

Read<T>(Void*)

Lê um valor do tipo T do local especificado.

ReadUnaligned<T>(Byte)

Lê um valor de tipo T do endereço fornecido sem assumir o alinhamento dependente da arquitetura do endereço de origem.

ReadUnaligned<T>(Void*)

Lê um valor de tipo T do local determinado sem assumir o alinhamento dependente da arquitetura do endereço de origem.

SizeOf<T>()

Retorna o tamanho de um valor do parâmetro de tipo fornecido.

SkipInit<T>(T)

Ignora regras de atribuição definidas para uma determinada referência.

Subtract<T>(T, Int32)

Subtrai um deslocamento do ponteiro gerenciado fornecido.

Subtract<T>(T, IntPtr)

Subtrai um deslocamento de elemento do ponteiro gerenciado fornecido.

Subtract<T>(T, UIntPtr)

Subtrai um deslocamento de elemento do ponteiro gerenciado fornecido.

Subtract<T>(Void*, Int32)

Subtrai um deslocamento de elemento do ponteiro não gerenciado fornecido.

SubtractByteOffset<T>(T, IntPtr)

Subtrai um deslocamento de bytes do ponteiro gerenciado fornecido.

SubtractByteOffset<T>(T, UIntPtr)

Subtrai um deslocamento de bytes do ponteiro gerenciado fornecido.

Unbox<T>(Object)

Retorna um mutable ref valor em caixa.

Write<T>(Void*, T)

Grava um valor do tipo T no local especificado.

WriteUnaligned<T>(Byte, T)

Grava um valor do tipo T no local especificado sem assumir o alinhamento dependente da arquitetura do endereço de destino.

WriteUnaligned<T>(Void*, T)

Grava um valor do tipo T no local especificado sem assumir o alinhamento dependente da arquitetura do endereço de destino.

Aplica-se a