在C 中,我们可以通过使用工会将相同的地址用于字符串和int变量。我希望在C#中定义一个联合,该联合具有两个类型INT和字符串的成员变量。
我尝试了3种方法来定义联合,其中两个工作显示的工作看起来不等同于C 的结合。第三个似乎等效的联合显示错误"应用在休息模式"
这起作用,但似乎不等同于C 联合,因为在字符串变化的同时,整数的连续地址保持不变。(如果结合,一对int和字符串必须具有相同的地址(。
[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;
}
我看到的错误是"应用程序处于断路模式"
我想你想要这个:
[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