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.