Como criar uma união do C/C++ usando atributos em C#
Usando atributos, você pode personalizar como os structs são dispostos na memória. Por exemplo, você pode criar o que é conhecido como uma união no C/C++ usando os atributos StructLayout(LayoutKind.Explicit)
e FieldOffset
.
Neste segmento de código, todos os campos de TestUnion
são iniciados no mesmo local na memória.
[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;
}
O código a seguir é outro exemplo em que os campos são iniciados em locais diferentes definidos explicitamente.
[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;
}
Os dois campos inteiros, i1
e i2
combinados, compartilham os mesmos locais de memória que lg
. lg
usa os primeiros oito bytes, ou então i1
usa os quatro primeiros bytes e i2
usa os próximos quatro bytes. Esse tipo de controle sobre o layout do struct é útil ao usar a invocação de plataforma.
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de