Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Mediante el uso de atributos, puede personalizar la manera en que los structs se disponen en la memoria. Por ejemplo, puede crear lo que se conoce como una unión en C/ C++ mediante los atributos StructLayout(LayoutKind.Explicit)
y FieldOffset
.
En este segmento de código, todos los campos de TestUnion
empiezan en la misma ubicación en la memoria.
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
[System.Runtime.InteropServices.FieldOffset(0)]
public int i;
[System.Runtime.InteropServices.FieldOffset(0)]
public double d;
[System.Runtime.InteropServices.FieldOffset(0)]
public char c;
[System.Runtime.InteropServices.FieldOffset(0)]
public byte b;
}
El código a continuación es otro ejemplo en el que los campos empiezan en ubicaciones diferentes establecidas explícitamente.
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestExplicit
{
[System.Runtime.InteropServices.FieldOffset(0)]
public long lg;
[System.Runtime.InteropServices.FieldOffset(0)]
public int i1;
[System.Runtime.InteropServices.FieldOffset(4)]
public int i2;
[System.Runtime.InteropServices.FieldOffset(8)]
public double d;
[System.Runtime.InteropServices.FieldOffset(12)]
public char c;
[System.Runtime.InteropServices.FieldOffset(14)]
public byte b;
}
Los dos campos enteros, i1
y i2
combinados, tiene las mismas ubicaciones en la memoria que lg
. O bien lg
usa los primeros 8 bytes o i1
usa los primeros 4 bytes y i2
usa los 4 bytes siguientes. Este tipo de control sobre el diseño del struct es útil cuando se usa la invocación de plataforma.