operador sizeof: determine las necesidades de memoria de un tipo determinado.
El operador sizeof
devuelve el número de bytes ocupados por una variable de un tipo determinado. En el código seguro, el argumento para el operador sizeof
debe ser el nombre de un tipo no administrado o un parámetro de tipo que sea restringido para que sea un tipo no administrado. Los tipos no administrados incluyen todos los tipos numéricos, tipos de enumeración y tupla y tipos de estructura donde todos los miembros son tipos no administrados.
Las expresiones presentadas en la tabla siguiente se evalúan en tiempo de compilación con los valores constantes correspondientes y no requieren un contexto no seguro:
Expresión | 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 |
En el código no seguro, el argumento para sizeof
puede incluir tipos de puntero y tipos administrados, incluidos los parámetros de tipo sin restricciones. Algunos ejemplos son object
y string
.
En el ejemplo siguiente se muestra el uso del 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)}");
}
}
El operador sizeof
devuelve el número de bytes asignados por Common Language Runtime en memoria administrada. Para los tipos de estructura , dicho valor incluye todo relleno, tal como lo demuestra el ejemplo anterior. El resultado del operador sizeof
puede diferir del resultado del método Marshal.SizeOf, que devuelve el tamaño de un tipo en memoria no administrada.
En código no seguro, cuando el argumento es un tipo administrado, el operador sizeof
devuelve el tamaño de una referencia, no el número de bytes asignados para una instancia de ese tipo.
Importante
El valor devuelto por sizeof
puede diferir del resultado de Marshal.SizeOf(Object), que devuelve el tamaño del tipo en memoria no administrada.
Especificación del lenguaje C#
Para obtener más información, vea la sección Operador sizeof de la Especificación del lenguaje C#.