2012-02-07 7 views
8

Por qué si yo uso:Struct - Layout.Explicit - Constructor - completamente asignar campos

struct MyStruct 
{ 
     [FieldOffset (0)] public uint Data; 
     [FieldOffset (0)] public byte Something; 
} 

public MyStruct (uint pData) 
{ 
    Data = pData; // setting Data field also sets Something field 
} 

C# dice que necesito para asignar el campo 'algo':/Yo sé que puedo hacer un "Constructor: esto() " pero el compilador debe saber que el campo 'Datos' contiene el campo 'Algo'.

Por lo tanto, debería llamar al constructor sin parámetros primero, ¿es la única manera?

Respuesta

-2

Debe inicializar todos los campos de una estructura si define un constructor personalizado. Consulte this MSDN tutorial in structs para obtener más información, específicamente bajo el encabezado Constructors and Heistence.

He aquí un párrafo extraído de ese enlace con respecto a esto:

Las estructuras pueden declarar constructores, pero hay que tener parámetros. Es un error declarar un constructor predeterminado (sin parámetros) para una estructura. Los miembros de Struct no pueden tener inicializadores. Siempre se proporciona un constructor predeterminado para inicializar los miembros de la estructura a sus valores predeterminados.

+0

Estoy hablando de otra cosa. – zgnilec

+0

@zgnilec En ese caso, le sugiero que revise su pregunta, ya que no tiene mucho sentido. –

+0

Bueno, tal vez alguien más me entenderá. – zgnilec

5

Sí, deberá llamar al constructor predeterminado.

public MyStruct (uint pData) : this() 
{ 
    //... 
} 

El compilador generará entonces las siguientes instrucciones IL en el comienzo de su constructor:

ldarg.0   // Push address of struct onto stack 
initobj MyStruct // Pop address of struct and initialize it with "all zeros" 
+0

Esto es muy útil. Hacer esto acelera el código en uno o más nanosegundos (dependiendo de cuántos campos se encuentren). – Forestrf

Cuestiones relacionadas