为什么char的存储大小似乎发生了变化?

时间:2014-12-29 19:30:45

标签: c# struct char interop marshalling

如果我这样做

char c = 'A';
byte[] b = BitConverter.GetBytes(c);

b的长度为2。

但是,如果我有以下结构用于互操作目的

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct MyStruct
{
    int i;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    char[] c;

    public int TheInt
    {
        get { return i; }
        set { i = value; }
    }

    public string TheString
    {
        get { return new string(c); }
        set { c = value.ToCharArray(); }
    }
}

然后做

MyStruct m = new MyStruct();
m.TheInt = 10;
m.TheString = "Balloons";

int mSize = Marshal.SizeOf(m);

mSize是12,而不是我预期的20。

MSDN说char存储是2个字节。 第一个例子支持这个。

我的结构有问题吗? 我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

因为您正在编组,并且默认情况下,char将被编组为ANSI字符而不是Unicode字符。所以“气球”是8个字符,ANSI编码时为8个字节,而int为4个字节,即12个。

如果您希望编组的大小为20,请更改您的StructLayout并将ChatSet设置为Unicode:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]

现在你的结构大小为20。

  

MSDN说char存储是2个字节。

当我们谈论CLR char时,情况确实如此,但不是在编组的情况下。

答案 1 :(得分:0)

  • char是2个字节或16位Unicode字符(U +0000到U + ffff)
  • char []是指针类型
  • int是4个字节

因此,关于编组,我会选择vcsjones的回答。