Lire en anglais

Partager via


opérateur sizeof : déterminer les besoins en mémoire d’un type donné

L’opérateur sizeof retourne le nombre d’octets occupés par une variable d’un type donné. Dans le code sécurisé, l’argument de l’opérateur sizeof doit être le nom d’un type non managé ou d’un paramètre de type contraint à être un type non managé. Les types non managés incluent tous les types numériques, les types d’énumération et les types tuple et struct où tous les membres sont des types non managés.

Les expressions présentées dans le tableau suivant sont évaluées au moment de la compilation pour les valeurs constantes correspondantes et ne nécessitent pas de contexte non sécurisé :

Expression Valeur constante
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

Dans le code non sécurisé, l’argument à sizeof peut inclure des types de pointeur et des types managés, y compris des paramètres de type non contraints. Les exemples incluent object et string.

L’exemple suivant illustre l’utilisation de l’opérateur sizeof :

C#
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’opérateur sizeof retourne le nombre d’octets alloués par le Common Language Runtime en mémoire managée. Pour struct types, cette valeur inclut tout remplissage, comme l’illustre l’exemple précédent. Le résultat de l’opérateur sizeof peut différer du résultat de la méthode Marshal.SizeOf, qui retourne la taille d’un type dans mémoire non managée.

Dans le code non sécurisé, lorsque l’argument est un type managé, l’opérateur sizeof retourne la taille d’une référence, et non le nombre d’octets alloués pour une instance de ce type.

Important

La valeur retournée par sizeof peut différer du résultat de Marshal.SizeOf(Object), qui retourne la taille du type en mémoire non managée.

Spécification du langage C#

Pour plus d’informations, consultez la section Opérateur sizeof de la spécification du langage C#.

Voir aussi