Procedimiento para crear una unión de C o C++ mediante atributos en C#
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.
Vea también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de