Condividi tramite


Operatore sizeof: determinare le esigenze di memoria per un determinato tipo

L'operatore sizeof restituisce il numero di byte occupati da una variabile di un determinato tipo. Nel codice sicuro, l'argomento dell'operatore sizeof deve essere il nome di un tipo non gestito o un parametro di tipo vincolato come tipo non gestito. I tipi non gestiti includono tutti i tipi numerici, i tipi enumerativi e i tipi di tupla e struct in cui tutti i membri sono tipi non gestiti.

Le espressioni presentate nella tabella seguente vengono valutate in fase di compilazione con i valori costanti corrispondenti e non richiedono un contesto non sicuro:

Espressione Valore costante
sizeof(sbyte) 1
sizeof(byte) 1
sizeof(short) 2
sizeof(ushort) 2
sizeof(int) 4
sizeof(uint) 4
sizeof(long) 8
sizeof(ulong) 8
sizeof(char) 2
sizeof(float) 4
sizeof(double) 8
sizeof(decimal) 16
sizeof(bool) 1

Nel codice unsafe, l'argomento di sizeof può includere tipi di puntatore e tipi gestiti, inclusi i parametri di tipo non vincolato. Gli esempi includono object e string.

Nell'esempio seguente viene illustrato l'utilizzo dell'operatore sizeof:

public struct Point
{
    public Point(byte tag, double x, double y) => (Tag, X, Y) = (tag, x, y);

    public byte Tag { get; }
    public double X { get; }
    public double Y { get; }
}

public class SizeOfOperator
{
    public static void Main()
    {
        Console.WriteLine(sizeof(byte));  // output: 1
        Console.WriteLine(sizeof(double));  // output: 8

        DisplaySizeOf<Point>();  // output: Size of Point is 24
        DisplaySizeOf<decimal>();  // output: Size of System.Decimal is 16

        unsafe
        {
            Console.WriteLine(sizeof(Point*));  // output: 8
        }
    }

    static unsafe void DisplaySizeOf<T>() where T : unmanaged
    {
        Console.WriteLine($"Size of {typeof(T)} is {sizeof(T)}");
    }
}

L'operatore sizeof restituisce il numero di byte allocati da Common Language Runtime nella memoria gestita. Per tipi di struct, tale valore include qualsiasi spaziatura interna, come illustrato nell'esempio precedente. Il risultato dell'operatore sizeof può differire dal risultato del metodo Marshal.SizeOf, che restituisce le dimensioni di un tipo in memoria non gestita.

Nel codice unsafe, quando l'argomento è un tipo gestito, l'operatore sizeof restituisce le dimensioni di un riferimento, non il numero di byte allocati per un'istanza di tale tipo.

Importante

Il valore restituito da sizeof può differire dal risultato di Marshal.SizeOf(Object), che restituisce le dimensioni del tipo in memoria non gestita.

Specifica del linguaggio C#

Per ulteriori informazioni, consultare la sezione Operatore sizeof delle specifiche del linguaggio C# .

Vedere anche