2011-02-10 10 views
17

Duplicar posible:
How to check the number of bytes consumed by my Structure?Obtener tamaño de struct en C#

tengo una estructura en forma compacta de

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public struct test 
{ 
    public int a; 
    public uint16 b; 
} 

¿Cómo consigo el tamaño de ¿La estructura como el compilador establece que sizeof solo puede usarse en un contexto inseguro?

Gracias.

+0

¿Para qué lo necesitas? –

+2

Necesito enviarlo a través de la red. Obtuve la API que necesita que especifique los bytes de la estructura, incluidos el encabezado + datos, etc. – Nick

+0

Eche un vistazo a http://stackoverflow.com/questions/2418749/c-why-sizeof-is-unsafe-and-how -to-get-size-of-a-struct-in-a-safe-way – Ray

Respuesta

1

¿Pone el operador de sizeof en un contexto inseguro como lo sugiere el compilador?

Algo como esto supongo:

int size; 
unsafe 
{ 
    size=sizeof(Test); 
} 

Pero no estoy seguro de si realmente quieres hacer eso. Tiendo a usar un serializador normal en lugar de estructuras con un diseño específico para esto. IMO debería usar tales estructuras solo para la interoperabilidad nativa y no para la serialización simple.

Y mirando la documentación de la función, la clasificación también puede interferir con el tamaño (aunque no en este ejemplo).

+2

Eso todavía daría el error de compilación. –

+0

@ JohnB.Lambe ¿Qué quieres decir? Este código compila y devuelve '6', como se esperaba (una vez que arreglas los errores triviales en el código del OP) – CodesInChaos

+0

@Porges' inseguro' no es contagioso. Solo necesita utilizar la bandera adecuada para el ensamblaje y marcar el bloque de código relevante como "inseguro". – CodesInChaos

24

El método SizeOf hace el truco.

int size = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Point)); 
+1

Para ser más específicos, es System.Runtime.InteropServices.Marshal.SizeOf, aplicado a una instancia. Debería devolver los mismos resultados que el idioma "sizeof" aplicado al tipo. Ejemplo a continuación. –

+0

Esto funcionó en combinación con el comentario de Reb.Cabin. Gracias, ahora realmente puedo descubrir cuál es una estructura eficiente y cuál no. – Madmenyo

+1

typeof (Point), Point es una clase. Con struct me da Exception !! Pruebe int size = System.Runtime.InteropServices.Marshal.SizeOf (typeof (test)); – MrHIDEn