在C#中是否有等效的带有int和字符串成员变量的c ++联合?

时间:2019-05-21 04:50:03

标签: c# c++

在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;
}

我看到的错误是“应用程序处于中断模式”

1 个答案:

答案 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