Unsafe Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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
Aviso
Esse tipo destina-se a cenários avançados de manipulação de ponteiro. Supõe-se que os chamadores estejam familiarizados com eCMA-335, s. II.14.4 e III.1.1.5 e com o Adendo de Especificação da CLI do ECMA-335.
A maioria das APIs nesse tipo não executa nenhuma verificação ou validação de argumento. O uso incorreto dessas APIs pode corromper a memória do processo ou desestabilizar o runtime do .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 . Verificações típicas de segurança de tipo do NET para atender às suas metas de desempenho.
Considere o exemplo a seguir, que inverte os elementos dentro de um Span<T>
.
Observação
Esses exemplos existem simplesmente para fins de demonstração. Em aplicativos do mundo real, os desenvolvedores devem 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 fortemente tipado 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 da 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 exatidã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 do .NET.
Métodos
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 |
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 |
BitCast<TFrom,TTo>(TFrom) |
Reinterpreta o valor fornecido do tipo |
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 |
Copy<T>(Void*, T) |
Copia um valor do tipo |
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 pressupor um 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 pressupor um alinhamento dependente da arquitetura dos endereços. |
InitBlock(Byte, Byte, UInt32) |
Inicializa um bloco de memória no local especificado com um valor inicial fornecido. |
InitBlock(Void*, Byte, UInt32) |
Inicializa um bloco de memória no local especificado com um valor inicial fornecido. |
InitBlockUnaligned(Byte, Byte, UInt32) |
Inicializa um bloco de memória no local especificado com um valor inicial fornecido sem pressupor um alinhamento dependente de arquitetura do endereço. |
InitBlockUnaligned(Void*, Byte, UInt32) |
Inicializa um bloco de memória no local especificado com um valor inicial fornecido sem pressupor um alinhamento dependente de arquitetura do endereço. |
IsAddressGreaterThan<T>(T, T) |
Retorna um valor que indica se um ponteiro gerenciado especificado é maior que outro ponteiro gerenciado especificado. |
IsAddressLessThan<T>(T, T) |
Retorna um valor que indica se um ponteiro gerenciado especificado é menor que outro ponteiro gerenciado especificado. |
IsNullRef<T>(T) |
Determina se um determinado ponteiro gerenciado para um valor do tipo |
NullRef<T>() |
Retorna um ponteiro gerenciado nulo para um valor do tipo |
Read<T>(Void*) |
Lê um valor do tipo |
ReadUnaligned<T>(Byte) |
Lê um valor do tipo |
ReadUnaligned<T>(Void*) |
Lê um valor do tipo |
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 |
Write<T>(Void*, T) |
Grava um valor do tipo |
WriteUnaligned<T>(Byte, T) |
Grava um valor do tipo |
WriteUnaligned<T>(Void*, T) |
Grava um valor do tipo |