Unsafe Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Contém funcionalidades genéricas e de baixo nível para manipular ponteiros geridos e não geridos.
public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
- Herança
-
Unsafe
Observações
Warning
Este tipo destina-se a cenários avançados de manipulação de ponteiros. Presume-se que os chamadores estejam familiarizados com o ECMA-335, Sec. II.14.4 e III.1.1.5, e com o Adendo da Especificação CLI do ECMA-335.
A maioria das APIs deste tipo não realiza qualquer verificação ou validação de argumentos. O uso incorreto destas APIs pode corromper a memória do processo ou desestabilizar o tempo de execução .NET.
Este tipo é normalmente usado por autores de bibliotecas de baixo nível que querem escrever código de alto desempenho e estão dispostos a suprimir as verificações típicas de segurança de tipos do .NET para atingir os seus objetivos de desempenho.
Considere o seguinte exemplo, que inverte os elementos dentro de um Span<T>.
Note
Estes exemplos existem simplesmente para fins de demonstração. Em aplicações do mundo real, os programadores devem antes usar funções auxiliares como Reverse, que estão melhor otimizadas do que estes 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];
}
}
Este método é totalmente seguro para tipos e o runtime .NET pode inserir verificações de limites para ajudar a garantir a segurança. No entanto, os autores de bibliotecas de baixo nível podem querer suprimir as verificações normais de segurança do .NET para melhorar o desempenho do seu próprio código. Estes programadores normalmente recorrem a ferramentas de análise estática ou às suas próprias revisões de código para ajudar a impor a correção. As Unsafe APIs permitem a um programador reescrever este código usando construtos não verificáveis, como mostra o exemplo seguinte.
// 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 tipos, cabe aos chamadores garantir que o código que estão a escrever é legal. O uso indevido destas APIs pode causar violações de acesso, criar buracos de GC, produzir código incorreto ou induzir comportamentos indefinidos e desestabilizadores dentro do runtime .NET.
Métodos
| Name | Description |
|---|---|
| Add<T>(T, Int32) |
Adiciona um deslocamento ao ponteiro gerido dado. |
| Add<T>(T, IntPtr) |
Adiciona um elemento deslocado ao ponteiro gerido dado. |
| Add<T>(T, UIntPtr) |
Adiciona um elemento deslocado ao ponteiro gerido dado. |
| Add<T>(Void*, Int32) |
Adiciona um elemento deslocado ao ponteiro não gerido dado. |
| AddByteOffset<T>(T, IntPtr) |
Adiciona um deslocamento de bytes ao ponteiro gerido dado. |
| AddByteOffset<T>(T, UIntPtr) |
Adiciona um deslocamento de bytes ao ponteiro gerido dado. |
| AreSame<T>(T, T) |
Determina se os ponteiros geridos especificados apontam para a mesma localização. |
| As<T>(Object) |
Conjura o objeto dado para o tipo especificado. |
| As<TFrom,TTo>(TFrom) |
Reinterpreta o ponteiro gerido dado como um novo apontador gerido para um valor do tipo |
| AsPointer<T>(T) |
Converte um ponteiro gerido num ponteiro não gerido. |
| AsRef<T>(T) |
Reinterpreta a referência apenas de leitura dada como uma referência mutável. |
| AsRef<T>(Void*) |
Converte um ponteiro não gerido num ponteiro gerido para um valor do tipo |
| BitCast<TFrom,TTo>(TFrom) |
Reinterpreta o valor dado do tipo |
| ByteOffset<T>(T, T) |
Determina o deslocamento do byte da origem para o destino a partir dos ponteiros geridos. |
| Copy<T>(T, Void*) |
Copia um valor de tipo |
| Copy<T>(Void*, T) |
Copia um valor de 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 assumir 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 assumir um alinhamento dependente da arquitetura dos endereços. |
| InitBlock(Byte, Byte, UInt32) |
Inicializa um bloco de memória na localização dada com um valor inicial dado. |
| InitBlock(Void*, Byte, UInt32) |
Inicializa um bloco de memória na localização dada com um valor inicial dado. |
| InitBlockUnaligned(Byte, Byte, UInt32) |
Inicializa um bloco de memória na localização dada com um valor inicial dado sem assumir um alinhamento dependente da arquitetura do endereço. |
| InitBlockUnaligned(Void*, Byte, UInt32) |
Inicializa um bloco de memória na localização dada com um valor inicial dado sem assumir um alinhamento dependente da arquitetura do endereço. |
| IsAddressGreaterThan<T>(T, T) |
Devolve um valor que indica se um ponteiro gerido especificado é maior do que outro ponteiro gerido especificado. |
| IsAddressGreaterThanOrEqualTo<T>(T, T) |
Determina se o endereço de memória referenciado por |
| IsAddressLessThan<T>(T, T) |
Devolve um valor que indica se um ponteiro gerido especificado é inferior a outro ponteiro gerido especificado. |
| IsAddressLessThanOrEqualTo<T>(T, T) |
Determina se o endereço de memória referenciado por |
| IsNullRef<T>(T) |
Determina se um dado ponteiro gerido para um valor do tipo |
| NullRef<T>() |
Devolve um ponteiro gerenciado nulo para um valor do tipo |
| Read<T>(Void*) |
Lê um valor de tipo |
| ReadUnaligned<T>(Byte) |
Lê um valor de tipo |
| ReadUnaligned<T>(Void*) |
Lê um valor de tipo |
| SizeOf<T>() |
Devolve o tamanho de um valor do parâmetro de tipo dado. |
| SkipInit<T>(T) |
Ignora regras de atribuição definidas para uma dada referência. |
| Subtract<T>(T, Int32) |
Subtrai um deslocamento do ponteiro gerido dado. |
| Subtract<T>(T, IntPtr) |
Subtrai um elemento deslocado do ponteiro gerido dado. |
| Subtract<T>(T, UIntPtr) |
Subtrai um elemento deslocado do ponteiro gerido dado. |
| Subtract<T>(Void*, Int32) |
Subtrai um elemento deslocado do ponteiro não gerido dado. |
| SubtractByteOffset<T>(T, IntPtr) |
Subtrai um deslocamento de bytes do ponteiro gerido dado. |
| SubtractByteOffset<T>(T, UIntPtr) |
Subtrai um deslocamento de bytes do ponteiro gerido dado. |
| Unbox<T>(Object) |
Devolve a |
| Write<T>(Void*, T) |
Escreve um valor de tipo |
| WriteUnaligned<T>(Byte, T) |
Escreve um valor de tipo |
| WriteUnaligned<T>(Void*, T) |
Escreve um valor de tipo |