Condividi tramite


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 o bool
  • 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 unmanagedvincolo 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#.

Vedi anche