Condividi tramite


Tipi non gestiti (riferimenti per C#)

Un tipo è un tipo non gestito se è uno dei tipi seguenti:

  • sbyte, byte, short, ushort, intuintlongulongnintnuint, charfloatdouble, o decimalbool
  • Qualsiasi tipo di enumerazione
  • Qualsiasi tipo di puntatore
  • Tupla i cui membri sono tutti di un tipo non gestito
  • Qualsiasi tipo di struct definito dall'utente che contiene solo campi di tipi non gestiti.

È possibile usare il unmanaged vincolo per specificare che un parametro di tipo è un tipo non puntatore, non nullable non gestito.

Anche un tipo di struct costruito che contiene campi di tipi non gestiti è non gestito, come illustrato nell'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

Uno struct generico può essere l'origine di tipi costruiti non gestiti e gestiti. L'esempio precedente definisce uno struct Coords<T> generico e presenta gli esempi di tipi costruiti non gestiti. L'esempio di un tipo gestito è Coords<object>. Viene gestito perché include i campi del object tipo, che è gestito. Se si desidera che tutti i tipi costruiti siano tipi non gestiti, usare il unmanaged vincolo nella definizione di uno struct generico:

public struct Coords<T> where T : unmanaged
{
    public T X;
    public T Y;
}

Specificazione del linguaggio C#

Per altre informazioni, vedere la sezione Tipi di puntatore della specifica del linguaggio C#.

Vedere anche