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# .