Partilhar via


operador sizeof - determinar as necessidades de memória para um determinado tipo

O operador sizeof retorna o número de bytes ocupados por uma variável de um determinado tipo. Em código seguro, o argumento para o operador sizeof deve ser o nome de um de tipo não gerenciado ou um parâmetro de tipo que restrito seja um tipo não gerenciado. Os tipos não gerenciados incluem todos os tipos numéricos, tipos de enum e tipos de tupla e estrutura em que todos os membros são tipos não gerenciados.

As expressões apresentadas na tabela a seguir são avaliadas em tempo de compilação para os valores constantes correspondentes e não exigem um contexto inseguro:

Expressão Valor 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

Em código não seguro, o argumento a sizeof pode incluir tipos de ponteiro e tipos gerenciados, incluindo parâmetros de tipo não restritos. Exemplos incluem object e string.

O exemplo a seguir demonstra o uso do operador 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)}");
    }
}

O operador sizeof retorna o número de bytes alocados pelo common language runtime na memória gerenciada. Para struct types, esse valor inclui qualquer preenchimento, como demonstra o exemplo anterior. O resultado do operador sizeof pode diferir do resultado do método Marshal.SizeOf, que retorna o tamanho de um tipo em memória não gerenciada.

Em código não seguro, quando o argumento é um tipo gerenciado, o operador sizeof retorna o tamanho de uma referência, não o número de bytes alocados para uma instância desse tipo.

Importante

O valor retornado por sizeof pode diferir do resultado de Marshal.SizeOf(Object), que retorna o tamanho do tipo na memória não gerenciada.

Especificação da linguagem C#

Para obter mais informações, consulte a seção The sizeof operator da C# language specification.

Ver também