Compartilhar 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. No código seguro, o argumento para o operador sizeof deve ser o nome de um tipo não gerenciado ou um parâmetro de tipo restrito para ser um tipo não gerenciado. Os tipos não gerenciados incluem todos os tipos numéricos, tipos enum e tipos tupla e struct cujos membros são todos 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 não seguro:

Expression 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

No código inseguro, o argumento para 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 tipos struct, esse valor inclui todo o preenchimento, como demonstra o exemplo anterior. O resultado do operador sizeof pode ser diferente do resultado do método Marshal.SizeOf, que retorna o tamanho de um tipo na memória não gerenciada.

No 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 ser diferente 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, confira a seção O operador sizeof, nas especificações da linguagem C#.

Consulte também