Compartir a través de


Unsafe Clase

Definición

Contiene funcionalidad genérica y de bajo nivel para manipular punteros administrados y no administrados.

public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
Herencia
Unsafe

Comentarios

Advertencia

Este tipo está pensado para escenarios avanzados de manipulación de punteros. Se supone que los autores de llamadas están familiarizados con ECMA-335, Sec. II.14.4 y III.1.1.5 y con el anexo de especificación de la CLI ecma-335.

La mayoría de las API de este tipo no realizan ninguna comprobación ni validación de argumentos. El uso incorrecto de estas API podría dañar la memoria del proceso o desestabilizar el entorno de ejecución de .NET.

Normalmente, los autores de bibliotecas de bajo nivel usan este tipo que quieren escribir código de alto rendimiento y están dispuestos a suprimir . Comprobaciones de seguridad de tipos típicas de NET para cumplir sus objetivos de rendimiento.

Considere el ejemplo siguiente, que invierte los elementos de un .Span<T>

Nota

Estos ejemplos existen simplemente con fines de demostración. En las aplicaciones del mundo real, los desarrolladores deben usar en su lugar funciones auxiliares como Reverse, que están mejor optimizadas que incluso estos ejemplos.

// 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 es totalmente seguro para tipos y el entorno de ejecución de .NET puede insertar comprobaciones de límites para ayudar a aplicar la seguridad. Sin embargo, es posible que los autores de bibliotecas de bajo nivel quieran suprimir . Comprobaciones de seguridad normales de NET para mejorar el rendimiento de su propio código. Normalmente, estos desarrolladores se basarían en herramientas de análisis estáticos o en sus propias revisiones de código para ayudar a aplicar la corrección. Las Unsafe API permiten a un desarrollador reescribir este código mediante construcciones no verificables, como se muestra en el ejemplo siguiente.

// 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));
  }
}

Dado que las API suprimen la Unsafe validación típica de seguridad de tipos, es necesario llamar a los autores de llamadas para asegurarse de que el código que están escribiendo es legal. El uso incorrecto de estas API podría provocar infracciones de acceso, crear agujeros de GC, generar codegen incorrectos o provocar comportamientos no definidos y desestabilizadores dentro del entorno de ejecución de .NET.

Métodos

Add<T>(T, Int32)

Agrega un desplazamiento al puntero administrado especificado.

Add<T>(T, IntPtr)

Agrega un desplazamiento de elemento al puntero administrado especificado.

Add<T>(T, UIntPtr)

Agrega un desplazamiento de elemento al puntero administrado especificado.

Add<T>(Void*, Int32)

Agrega un desplazamiento de elemento al puntero no administrado especificado.

AddByteOffset<T>(T, IntPtr)

Agrega un desplazamiento de bytes al puntero administrado especificado.

AddByteOffset<T>(T, UIntPtr)

Agrega un desplazamiento de bytes al puntero administrado especificado.

AreSame<T>(T, T)

Determina si los punteros administrados especificados apuntan a la misma ubicación.

As<T>(Object)

Convierte el objeto indicado al tipo especificado.

As<TFrom,TTo>(TFrom)

Reinterpreta el puntero administrado dado como un nuevo puntero administrado a un valor de tipo TTo.

AsPointer<T>(T)

Convierte un puntero administrado en un puntero no administrado.

AsRef<T>(T)

Reinterpreta la referencia de solo lectura dada como referencia mutable.

AsRef<T>(Void*)

Convierte un puntero no administrado en un puntero administrado en un valor de tipo T.

BitCast<TFrom,TTo>(TFrom)

Reinterpreta el valor especificado de tipo TFrom como un valor de tipo TTo.

ByteOffset<T>(T, T)

Determina el desplazamiento de bytes del origen al destino desde los punteros administrados especificados.

Copy<T>(T, Void*)

Copia un valor del tipo T en la ubicación especificada.

Copy<T>(Void*, T)

Copia un valor del tipo T en la ubicación especificada.

CopyBlock(Byte, Byte, UInt32)

Copia bytes desde la dirección de origen a la dirección de destino.

CopyBlock(Void*, Void*, UInt32)

Copia bytes desde la dirección de origen a la dirección de destino.

CopyBlockUnaligned(Byte, Byte, UInt32)

Copia bytes desde la dirección de origen a la dirección de destino sin tener en cuenta la alineación dependiente de la arquitectura de las direcciones.

CopyBlockUnaligned(Void*, Void*, UInt32)

Copia bytes desde la dirección de origen a la dirección de destino sin tener en cuenta la alineación dependiente de la arquitectura de las direcciones.

InitBlock(Byte, Byte, UInt32)

Inicializa un bloque de memoria en la ubicación indicada con un valor inicial especificado.

InitBlock(Void*, Byte, UInt32)

Inicializa un bloque de memoria en la ubicación indicada con un valor inicial especificado.

InitBlockUnaligned(Byte, Byte, UInt32)

Inicializa un bloque de memoria en la ubicación indicada con un valor inicial especificado sin tener en cuenta la alineación dependiente de la arquitectura de la dirección.

InitBlockUnaligned(Void*, Byte, UInt32)

Inicializa un bloque de memoria en la ubicación indicada con un valor inicial especificado sin tener en cuenta la alineación dependiente de la arquitectura de la dirección.

IsAddressGreaterThan<T>(T, T)

Devuelve un valor que indica si un puntero administrado especificado es mayor que otro puntero administrado especificado.

IsAddressLessThan<T>(T, T)

Devuelve un valor que indica si un puntero administrado especificado es menor que otro puntero administrado especificado.

IsNullRef<T>(T)

Determina si un puntero administrado determinado a un valor de tipo T es una referencia nula.

NullRef<T>()

Devuelve un puntero administrado nulo a un valor de tipo T.

Read<T>(Void*)

Lee un valor del tipo T desde la ubicación especificada.

ReadUnaligned<T>(Byte)

Lee un valor de tipo T de la dirección especificada sin asumir la alineación dependiente de la arquitectura de la dirección de origen.

ReadUnaligned<T>(Void*)

Lee un valor de tipo T de la ubicación especificada sin asumir la alineación dependiente de la arquitectura de la dirección de origen.

SizeOf<T>()

Devuelve el tamaño de un valor del parámetro de tipo especificado.

SkipInit<T>(T)

Omite las reglas de asignación definitivas para una referencia determinada.

Subtract<T>(T, Int32)

Resta un desplazamiento del puntero administrado especificado.

Subtract<T>(T, IntPtr)

Resta un desplazamiento de elemento del puntero administrado especificado.

Subtract<T>(T, UIntPtr)

Resta un desplazamiento de elemento del puntero administrado especificado.

Subtract<T>(Void*, Int32)

Resta un desplazamiento de elemento del puntero no administrado especificado.

SubtractByteOffset<T>(T, IntPtr)

Resta un desplazamiento de bytes del puntero administrado especificado.

SubtractByteOffset<T>(T, UIntPtr)

Resta un desplazamiento de bytes del puntero administrado especificado.

Unbox<T>(Object)

Devuelve un mutable ref a un valor con conversión boxing.

Write<T>(Void*, T)

Escribe un valor del tipo T en la ubicación especificada.

WriteUnaligned<T>(Byte, T)

Escribe un valor de tipo T en la ubicación especificada sin asumir la alineación dependiente de la arquitectura de la dirección de destino.

WriteUnaligned<T>(Void*, T)

Escribe un valor de tipo T en la ubicación especificada sin asumir la alineación dependiente de la arquitectura de la dirección de destino.

Se aplica a