Volver a la página principal
miércoles 12 febrero 2025
6

Diferencia entre sizeof y Marshal.SizeOf en C#

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.
  • Se evalúa en tiempo de compilación.
  • Solo funciona con tipos de valor (struct, int, float, etc.).
  • Requiere el modificador unsafe si se usa con estructuras personalizadas.

Ejemplo con sizeof

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine(sizeof(int));  // Salida: 4
        Console.WriteLine(sizeof(double)); // Salida: 8
    }
}

Ejemplo con estructura y 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.
  • Se evalúa en tiempo de ejecución.
  • Funciona con estructuras administradas y no administradas.
  • No requiere unsafe.
  • Se usa para interoperabilidad con código nativo (P/Invoke).

Ejemplo con 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)
    }
}

Diferencias clave

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
Afectado por StructLayout No

Conclusión

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.

Etiquetas:
csharp
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer