Вариант для типа данных Union в C# - PullRequest
0 голосов
/ 05 августа 2020

Я реализовал одну программу на C ++, у которой есть union Datatype. Теперь я хочу преобразовать эту программу в c#.

Я хочу использовать ту же структуру в c#, но не знаю, что можно использовать вместо типа данных union.

Мы используют Visual Studio 2013 и фреймворк 4.5.2.0

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Нет из коробки Union тип данных в C#

Однако вы можете подделать его с помощью struct и атрибут FieldOffset , наверное. Вы можете сделать это из-за необходимости взаимодействия, также вы иногда видите, что он используется для быстрого преобразования типа без приведения . Однако будьте осторожны, это считается чрезвычайно хакерским .

[StructLayout(LayoutKind.Explicit)]
struct SomeType
{
   [FieldOffset(0)] public int Myint;
   [FieldOffset(0)] public byte Byte1;
   [FieldOffset(1)] public byte Byte2;
   [FieldOffset(2)] public byte Byte3;
   [FieldOffset(3)] public byte Byte4;

}

Использование

var someType = new SomeType();

Console.WriteLine(someType.Myint);

someType.Byte1 = 2;
Console.WriteLine(someType.Myint);

someType.Byte2 = 4;
Console.WriteLine(someType.Myint);

Вывод

0
2
1026

Примечание : я бы серьезно подумал об использовании более общих языковых функций в C#, переосмыслил бы проблему и не использовал этот прием.

0 голосов
/ 05 августа 2020

К сожалению, C# не предлагает прямого "коробочного решения" по сравнению с типом данных C ++ 'Union. Однако BitConverter - вариант, если вы используете объединение для сопоставления байтов одного из типов другого.

Например:

int x = 15;
float y = BitConverter.ToInt32(BitConverter.GetBytes(x), 0);

и наоборот:

float y = 15f;
int x = BitConverter.ToInt32(BitConverter.GetBytes(y), 0);
...