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 sizeof operador deve ser o nome de um tipo não gerido incorporado.

As expressões apresentadas na tabela seguinte são avaliadas em tempo de compilação para os valores constantes correspondentes e não requerem 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

O tamanho de um tipo incorporado e não gerido é uma constante de tempo de compilação.

No código inseguro , pode usar sizeof o seguinte:

  • Um parâmetro de tipo que está restrito a ser um tipo não gerido devolve o tamanho desse tipo não gerido em tempo de execução.
  • Um tipo gerido ou um tipo ponteiro devolve o tamanho da referência ou apontador, não o tamanho do objeto a que se refere.

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.

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