Tipi non gestiti (Riferimenti per C#)
Un tipo è un tipo non gestito se è uno dei tipi seguenti:
sbyte
,byte
,short
,ushort
,int
,uint
,long
,ulong
,nint
,nuint
,char
,float
,double
,decimal
obool
- Qualsiasi tipo enum
- Qualsiasi tipo puntatore
- Una tupla i cui membri sono tutti di un tipo non gestito
- Qualsiasi tipo struct definito dall'utente che contenga solo campi di tipi non gestiti.
È possibile usare il unmanaged
vincolo per specificare che un parametro di tipo deve essere un tipo non gestito non puntatore che non ammette i valori Null.
Un tipo struct costruito che contiene solo campi di tipi non gestiti è anche non gestito, come mostra l'esempio seguente:
using System;
public struct Coords<T>
{
public T X;
public T Y;
}
public class UnmanagedTypes
{
public static void Main()
{
DisplaySize<Coords<int>>();
DisplaySize<Coords<double>>();
}
private unsafe static void DisplaySize<T>() where T : unmanaged
{
Console.WriteLine($"{typeof(T)} is unmanaged and its size is {sizeof(T)} bytes");
}
}
// Output:
// Coords`1[System.Int32] is unmanaged and its size is 8 bytes
// Coords`1[System.Double] is unmanaged and its size is 16 bytes
Un generico struct può essere l'origine di tipi costruiti sia non gestiti che gestiti. L'esempio precedente definisce un generico struct Coords<T>
e presenta gli esempi di tipi costruiti non gestiti. L'esempio di un tipo gestito è Coords<object>
. È gestito perché include i campi del tipo object
, che è gestito. Se si desidera che tutti i tipi costruiti siano tipi non gestiti, usare il vincolo unmanaged
nella definizione di un generico struct:
public struct Coords<T> where T : unmanaged
{
public T X;
public T Y;
}
Specifiche del linguaggio C#
Per altre informazioni, vedere la sezione Tipi puntatore nella specifica del linguaggio C#.