在C#中,是否有与INT和字符串成员变量相当的C 联合



在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

最新更新