在c ++中,我们可以通过使用联合将相同的地址用于字符串和int变量。我正在寻找在c#中定义一个并集,它具有两个类型为int和string的成员变量。
我尝试了3种定义并集的方法,下面显示的两种方法可以工作,但是它们看起来并不完全等同于c ++的并集。第三个似乎与并集等效的错误显示了“应用程序处于中断模式”错误
这可以工作,但看起来不像c ++联合,因为整数的连续地址保持不变而字符串的地址不变。 (如果是联合,一对int和string必须具有相同的地址)。
[StructLayout(LayoutKind.Explicit, Size = 128)]
public struct File_element
{
[FieldOffset(0)]
public int Line_no;
[FieldOffset(4)]
public string Line;
}
这也可行,但是我必须定义两个对象而不是单个对象,尽管仍然不确定其等同于c ++的结合
[StructLayout(LayoutKind.Explicit, Size = 128)]
public struct File_element
{
[FieldOffset(0)]
public int Line_no;
}
[StructLayout(LayoutKind.Sequential)]
public struct File_element2
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Line;
}
我正在寻找的与我的c ++工会完全等效的东西就是这个,但是当我尝试运行时,这会显示错误(“应用程序处于中断模式”)
[StructLayout(LayoutKind.Explicit, Size = 128)]
public struct File_element
{
[FieldOffset(0)]
public int Line_no;
[FieldOffset(0)]
public string Line;
}
我看到的错误是“应用程序处于中断模式”
答案 0 :(得分:2)
我想你想要这个:
[StructLayout(LayoutKind.Explicit)]
public unsafe struct File_element
{
[FieldOffset(0)]
public int Line_no;
[FieldOffset(0)]
public fixed byte Line[128];
}
等于
union File_element
{
int Line_no;
char Line[128];
}
您可以像常规数组一样使用Line
字段:
unsafe
{
File_element f = new File_element();
f.Line_no = 0x060708;
Console.WriteLine(f.Line[0]); //8
Console.WriteLine(f.Line[1]); //7
Console.WriteLine(f.Line[2]); //6
}
您还可以添加一个属性,将Line
转换为字符串
public unsafe struct File_element
{
....
public string LineString
{
get
{
fixed (byte* p = Line)
return new string((sbyte*)p);
}
}
}
f.Line_no = 0x373635;
Console.WriteLine(f.LineString); //567