2011-11-08 12 views
20

¿Por qué no puedo usar sizeof() en estructuras simples?sizeof() estructuras desconocidas. ¿Por qué?

por ejemplo:

private struct FloatShortPair 
{ 
    public float myFloat; 
    public short myShort; 
}; 

int size = sizeof(FloatShortPair); //CS0233 

CS0233 de error: 'FloatShortPair' no tiene un tamaño predefinido, por lo tanto sizeof sólo se puede utilizar en un contexto inseguro (considerar el uso de System.Runtime.InteropServices.Marshal.SizeOf)

MSDN estados:

El operador sizeof sólo se puede utilizar para los tipos que son el tiempo de compilación constantes. Si obtiene este error, asegúrese de que el tamaño de el identificador se pueda determinar en tiempo de compilación. Si no puede, entonces use SizeOf en vez de sizeof.

¿Cómo son las constantes de tiempo de compilación y no de cortocircuito? 8-/

Respuesta

23

Los tamaños de short y float son constantes - pero ¿cómo el CLR decidió hacer las maletas que flotan en la memoria no es necesariamente constante. Por ejemplo, en un procesador de 64 bits, puede decidir alinear cada valor en un límite de 8 bytes.

De la especificación C# 4, sección 18.5.8:

Para ciertos tipos predefinidos, el operador sizeof produce un valor constante como se muestra en la siguiente tabla.

[...]

Para todos los demás tipos, el resultado del operador sizeof es definido por la implementación y está clasificado como un valor, no una constante.

[...]

Para fines de alineación, puede haber relleno no identificado en el comienzo de una estructura, dentro de una estructura, y al final de una estructura.

Tenga en cuenta que puede utilizar sizeof en esta situación, dentro de un contexto unsafe. Si debe usar eso o Marshal.SizeOf depende de lo que esté tratando de hacer.

+1

Como el mensaje de error sugiere, use System.Runtime.InteropServices.Marshal.SizeOf. –

+1

Pregunta relacionada (perdón por secuestro): Si tiene un control más fino sobre el diseño del tipo (StructLayoutAttribute con compensaciones explícitas) ¿eso lo convierte en una constante de tiempo de compilación? – MattDavey

+1

@MattDavey: No según las especificaciones. Básicamente, la especificación del lenguaje C# intenta no entrar en los detalles de implementación de cosas como StructLayoutAttribute. –

Cuestiones relacionadas