Unsafe Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Contiene funzionalità generica e di basso livello per la modifica di puntatori gestiti e non gestiti.
public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
- Ereditarietà
-
Unsafe
Commenti
Avviso
Questo tipo è destinato agli scenari di manipolazione avanzata del puntatore. I chiamanti si presupponeno avere familiarità con ECMA-335, Sec. II.14.4 e III.1.1.5 e con l'addendum della specifica dell'interfaccia della riga di comando ECMA-335.
La maggior parte delle API di questo tipo non esegue alcun controllo o convalida degli argomenti. L'uso errato di queste API potrebbe danneggiare la memoria del processo o destabilizzare il runtime .NET.
Questo tipo viene in genere usato dagli autori di librerie di basso livello che vogliono scrivere codice ad alte prestazioni e sono disposti a eliminare . I controlli di sicurezza dei tipi tipici di NET soddisfano gli obiettivi di prestazioni.
Si consideri l'esempio seguente, che inverte gli elementi all'interno di un Span<T>
oggetto .
Nota
Questi esempi esistono semplicemente a scopo dimostrativo. Nelle applicazioni reali, gli sviluppatori devono invece usare funzioni helper come Reverse, che sono ottimizzate meglio di anche questi esempi.
// 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];
}
}
Questo metodo è completamente sicuro per il tipo e il runtime .NET può inserire i controlli dei limiti per applicare la sicurezza. Tuttavia, gli autori di librerie di basso livello potrebbero voler eliminare . I normali controlli di sicurezza di NET consentono di migliorare le prestazioni del proprio codice. Tali sviluppatori si affidano in genere a strumenti di analisi statici o alle proprie revisioni del codice per applicare la correttezza. Le Unsafe
API consentono a uno sviluppatore di riscrivere questo codice usando costrutti non verificabili, come illustrato nell'esempio seguente.
// 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));
}
}
Poiché le API eliminano la convalida tipica della sicurezza dei tipi, è necessario che i Unsafe
chiamanti assicurino che il codice che scrivono sia legale. L'uso improprio di queste API potrebbe causare violazioni di accesso, creare fori GC, produrre codicegeno non corretto o in caso contrario indurre comportamenti non definiti e destabilibili all'interno del runtime .NET.
Metodi
Add<T>(T, Int32) |
Aggiunge un offset al puntatore gestito specificato. |
Add<T>(T, IntPtr) |
Aggiunge un offset di elemento al puntatore gestito specificato. |
Add<T>(T, UIntPtr) |
Aggiunge un offset di elemento al puntatore gestito specificato. |
Add<T>(Void*, Int32) |
Aggiunge un offset di elemento al puntatore non gestito specificato. |
AddByteOffset<T>(T, IntPtr) |
Aggiunge un offset di byte al puntatore gestito specificato. |
AddByteOffset<T>(T, UIntPtr) |
Aggiunge un offset di byte al puntatore gestito specificato. |
AreSame<T>(T, T) |
Determina se i puntatori gestiti specificati puntano alla stessa posizione. |
As<T>(Object) |
Eseguire il cast dell'oggetto specificato al tipo specificato. |
As<TFrom,TTo>(TFrom) |
Reinterpreta il puntatore gestito specificato come nuovo puntatore gestito a un valore di tipo |
AsPointer<T>(T) |
Converte un puntatore gestito in un puntatore non gestito. |
AsRef<T>(T) |
Reinterpreta il riferimento di sola lettura specificato come riferimento modificabile. |
AsRef<T>(Void*) |
Converte un puntatore non gestito in un puntatore gestito in un valore di tipo |
BitCast<TFrom,TTo>(TFrom) |
Reinterpreta il valore specificato di tipo |
ByteOffset<T>(T, T) |
Determina l'offset di byte dall'origine alla destinazione dai puntatori gestiti specificati. |
Copy<T>(T, Void*) |
Copia un valore di tipo |
Copy<T>(Void*, T) |
Copia un valore di tipo |
CopyBlock(Byte, Byte, UInt32) |
Copia i byte dall'indirizzo di origine all'indirizzo di destinazione. |
CopyBlock(Void*, Void*, UInt32) |
Copia i byte dall'indirizzo di origine all'indirizzo di destinazione. |
CopyBlockUnaligned(Byte, Byte, UInt32) |
Copia i byte dall'indirizzo di origine all'indirizzo di destinazione senza presupporre l'allineamento dipendente dall'architettura degli indirizzi. |
CopyBlockUnaligned(Void*, Void*, UInt32) |
Copia i byte dall'indirizzo di origine all'indirizzo di destinazione senza presupporre l'allineamento dipendente dall'architettura degli indirizzi. |
InitBlock(Byte, Byte, UInt32) |
Inizializza un blocco di memoria in corrispondenza della posizione specificata con un valore iniziale specificato. |
InitBlock(Void*, Byte, UInt32) |
Inizializza un blocco di memoria in corrispondenza della posizione specificata con un valore iniziale specificato. |
InitBlockUnaligned(Byte, Byte, UInt32) |
Inizializza un blocco di memoria in corrispondenza della posizione specificata con un valore iniziale specificato senza presupporre l'allineamento dipendente dall'architettura dell'indirizzo. |
InitBlockUnaligned(Void*, Byte, UInt32) |
Inizializza un blocco di memoria in corrispondenza della posizione specificata con un valore iniziale specificato senza presupporre l'allineamento dipendente dall'architettura dell'indirizzo. |
IsAddressGreaterThan<T>(T, T) |
Restituisce un valore che indica se un puntatore gestito specificato è maggiore di un altro puntatore gestito specificato. |
IsAddressLessThan<T>(T, T) |
Restituisce un valore che indica se un puntatore gestito specificato è minore di un altro puntatore gestito specificato. |
IsNullRef<T>(T) |
Determina se un puntatore gestito specificato a un valore di tipo |
NullRef<T>() |
Restituisce un puntatore gestito null a un valore di tipo |
Read<T>(Void*) |
Legge un valore di tipo |
ReadUnaligned<T>(Byte) |
Legge un valore di tipo |
ReadUnaligned<T>(Void*) |
Legge un valore di tipo |
SizeOf<T>() |
Restituisce le dimensioni di un valore del parametro di tipo specificato. |
SkipInit<T>(T) |
Ignora le regole di assegnazione definite per un riferimento specificato. |
Subtract<T>(T, Int32) |
Sottrae un offset dal puntatore gestito specificato. |
Subtract<T>(T, IntPtr) |
Sottrae un offset di elemento dal puntatore gestito specificato. |
Subtract<T>(T, UIntPtr) |
Sottrae un offset di elemento dal puntatore gestito specificato. |
Subtract<T>(Void*, Int32) |
Sottrae un offset di elemento dal puntatore non gestito specificato. |
SubtractByteOffset<T>(T, IntPtr) |
Sottrae un offset di byte dal puntatore gestito specificato. |
SubtractByteOffset<T>(T, UIntPtr) |
Sottrae un offset di byte dal puntatore gestito specificato. |
Unbox<T>(Object) |
Restituisce un |
Write<T>(Void*, T) |
Scrive un valore di tipo |
WriteUnaligned<T>(Byte, T) |
Scrive un valore di tipo |
WriteUnaligned<T>(Void*, T) |
Scrive un valore di tipo |