2008-12-26 10 views
5

Estoy jugando con DLL de llamadas desde C#, y encontré la necesidad de definir mis propias estructuras. Un montón de artículos obligan a un diseño secuencial para la estructura con¿Cuándo debería especificar explícitamente StructLayout?

[StructLayout(LayoutKind.Sequential)] 
struct Foo ... 

Por lo tanto, he seguido de baño, y mi programa funcionó. Ahora, cuando saqué la línea, todavía funciona. ¿Por qué lo necesito?

Respuesta

4

El diseño interno de una estructura administrada no está documentado ni es detectable. Los detalles de implementación, como la orden de los miembros y el embalaje, están ocultos intencionalmente. Con el atributo [StructLayout], fuerza al Marshaller P/Invoke a imponer un diseño y empaque específicos.

Que el valor predeterminado coincida con lo que necesita para que su código funcione es simplemente un accidente. Aunque no es poco común. Tenga en cuenta la propiedad Type.StructLayoutAttribute.

+0

Gracias por la respuesta. Acabo de echar un vistazo a StructLayoutAttribute de mi estructura con y sin esa línea. Parece que ambos me dan secuencial. ¿Es eso el predeterminado? – biozinc

+1

Sí. Tengo que escribir 10 caracteres por alguna razón ... –

0

No estoy del todo seguro, pero puede afectar la serialización binaria: podría escupir los campos para no nombrar ni pedir información (lo que da como resultado un archivo más pequeño), pero eso es un capricho completo.

1

Punto de interés. Estoy seguro de que tuve un código que falló hasta que puse un LayoutKind.Sequential explícito, sin embargo he confirmado que Sequential es el predeterminado para las estructuras incluso en 1.1.

Nota del VB Reference for Structure implica al Observaciones> Comportamiento> Consumo de memoria que es necesario especificar StructLayout confirmar el diseño de memoria, pero la documentación para StructLayoutAttribute afirma secuencial es el valor predeterminado para estructuras en compiladores de Microsoft.

Cuestiones relacionadas