En C#, tanto sizeof como Marshal.SizeOf se utilizan para obtener el tamaño en bytes de un tipo de datos o estructura. Sin embargo, hay diferencias clave en su uso y comportamiento.
sizeof en C#
sizeof es un operador en C# que devuelve el tamaño en bytes de un tipo primitivo o una estructura no administrada.
struct, int, float, etc.).
unsafe si se usa con estructuras personalizadas.
sizeof
using System;
class Program
{
static void Main()
{
Console.WriteLine(sizeof(int)); // Salida: 4
Console.WriteLine(sizeof(double)); // Salida: 8
}
}
unsafe
using System;
struct MiStruct
{
public int x;
public double y;
}
class Program
{
static unsafe void Main()
{
Console.WriteLine(sizeof(MiStruct)); // Salida: 16
}
}
Marshal.SizeOf en C#
Marshal.SizeOf pertenece a System.Runtime.InteropServices.
unsafe.
Marshal.SizeOf
using System;
using System.Runtime.InteropServices;
struct MiStruct
{
public int x;
public double y;
}
class Program
{
static void Main()
{
Console.WriteLine(Marshal.SizeOf(typeof(MiStruct))); // Salida: 16 (dependiendo de la alineación)
}
}
| Característica |
sizeof
|
Marshal.SizeOf
|
|---|---|---|
| Evaluación | En compilación | En ejecución |
| Tipos soportados | Tipos primitivos y structs no administradas | Structs administradas y no administradas |
Requiere unsafe
|
Sí, en structs personalizadas | No |
| Usado en P/Invoke | No | Sí |
Afectado por StructLayout
|
No | Sí |
Usa sizeof cuando trabajes con tipos primitivos o estructuras simples en código seguro o sin interoperabilidad. Usa Marshal.SizeOf cuando necesites obtener el tamaño en memoria en tiempo de ejecución, especialmente para interoperabilidad con código nativo.
Jorge García
Fullstack developer