代码之家  ›  专栏  ›  技术社区  ›  Simsons

如何获得结构的更新大小?当我向动态数组字段添加值时,结构的大小没有得到更新

  •  1
  • Simsons  · 技术社区  · 14 年前

    这和我以前的经历有关 question

    我已将结构创建为:

    public struct Smb_Parameters
            {
                public byte WordCount;
                public ushort[] Words;
            }
    

    Smb_Parameters smbParameter = new Smb_Parameters();
    int len1 = Marshal.SizeOf(smbParameter );
                MessageBox.Show(len1.ToString());
    

    但当我将值赋给结构字段时:

     Smb_Parameters smbParameter = new Smb_Parameters();
     string myString= "String  ll be converted to byte";
     smbParameter.WordCount=0x00;
     smbParameter .Words=Encoding.ASCII.GetBytes(myString);
     int len1 = Marshal.SizeOf(smbParameter );
     MessageBox.Show(len1.ToString());
    

    3 回复  |  直到 8 年前
        1
  •  2
  •   Jeff Mercado    14 年前

    如果你想得到的大小,如果它是一个 非受管的 类型,则需要提供有关其字段的一些信息(例如,数组的长度)。没有它,就不会考虑数组长度。

    例如。,

    public struct Smb_Parameters1
    {
        public byte WordCount; //1 byte
        public ushort[] Words; //4 bytes (a "pointer")
    }
    Marshal.SizeOf(typeof(Smb_Parameters1)); //8 (with padding)
    //I don't see how you get 4 unless you are on a 16-bit system maybe
    
    [StructLayout(LayoutKind.Sequential)]
    public struct Smb_Parameters2
    {
        public byte WordCount; //1 byte
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=10)]
        public ushort[] Words; //20 bytes (2 * 10 bytes)
    }
    Marshal.SizeOf(typeof(Smb_Parameters2)); //22 (with padding)
    

    请注意,这些大小是固定的(就像它是在C/C++程序中声明的)。报告的大小 SizeOf() 将只使用这些,而不考虑存储在多大的数组中 Words .

    Smb_Parameters1 s1 = new Smb_Parameters1() { Words = new ushort[] { 0, 1, 2 } };
    Smb_Parameters2 s2 = new Smb_Parameters2() { Words = new ushort[] { 0, 1, 2 } };
    Marshal.SizeOf(s1); //8 bytes
    Marshal.SizeOf(s2); //22 bytes
    
        2
  •  1
  •   Thomas Levesque    14 年前

    这个 Words 字段是数组,数组是引用类型。该结构实际上并不包含数组项,它只包含对数组的引用,该引用存储在其他地方(通常在堆上)。所以呢 SizeOf 总是返回相同的大小,因为引用的大小不依赖于该引用所指向的对象的大小。

        3
  •  0
  •   codymanix    14 年前

    Marshal.SizeOf()

    你可以用 Marshal.SizeOf(typeof(byte))+Marshal.SizeOf(typeof(ushort))*yourarraylength

    BinaryFormatter 类将结构序列化为二进制形式。它返回一个字节数组。如果计算它的长度,就知道它的序列化大小。请注意,BinaryFormatter的结果不容易被非.net语言读取,因为它的格式仅为.net本机格式。