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#.