从VC转向C#,诸多不习惯,C#结构中不能直接指定数组大小了:示例:
    public struct ItemInfo
    {
        public int ? postion;
        public char[] id ;
        public int ? StartUnitPos;
        public int ? HaveUnit;
        public int ? ValueSize;
        public int ? PreValuePos;
        public int ? BackValuePos;
        public int ? flag;
        private int reserve;        public ItemInfo( int ? n  )
        {
            id = new char[512];
            postion = n ;
            StartUnitPos = n;
            HaveUnit = n;
            ValueSize = n;
            PreValuePos = n;
            BackValuePos = n;
            flag = n;
            reserve = 0;
        }
    }我需要知道该结构在内存中占多大地方,用了Marshal.SizeOf (sizeof编译未通过) ,结果是64。看来C#没把里面数组占用的空间算上。有没有方法能得到完整的大小?就是说包括数组空间,就好比VC中求结构体大小一样。

解决方案 »

  1.   

    c#中是没有动态数组的,数组分配内存时必须指定大小
    想动态指定一般用arraylist
      

  2.   


        public struct ImageDataMsg
        {
            public char DataType;
        public int Srv_index;
            public char ConvertType;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
        public int[] VecLayer;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public int[] GridLayer;
        public int Scale_index;
        public int x_pos;
        public int y_pos;
            public int ClientArea_x;
            public int ClientArea_y;
        }这样定义结构体
    int size = Marshal.SizeOf(type);这样得到结构体的字节数
      

  3.   

        [Serializable]
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct UserType
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
            public char[] coid;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
            public char[] usrid;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
            public Char[] roleid;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
            public char[] usrpwd;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)]
            public char[] usrname;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
            public char[] usrtitle;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
            public char[] usrtel1;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
            public char[] usrtel2;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)]
            public char[] usremail;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
            public char[] usrmobile;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
            public char[] usrvoice;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
            public char[] pwdexpdt;
            public byte status;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public char[] createddt;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
            public char[] createdby;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public char[] updateddt;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
            public char[] updatedby;        public UserType(string coid, string usrid, string roleid, string usrpwd, string usrname, string usrtitle, 
                string usrtel1, string usrtel2, string usremail, string usrmobile, string usrvoice, string pwdexpdt,
                byte status, string createddt, string createdby, string updateddt, string updatedby)
            {
                this.coid = coid.PadRight(11, '\0').ToCharArray();
                this.usrid = usrid.PadRight(11, '\0').ToCharArray();
                this.roleid = roleid.PadRight(11, '\0').ToCharArray();
                this.usrpwd = usrpwd.PadRight(21, '\0').ToCharArray();
                this.usrname = usrname.PadRight(31, '\0').ToCharArray();
                this.usrtitle = usrtitle.PadRight(21, '\0').ToCharArray();
                this.usrtel1 = usrtel1.PadRight(21, '\0').ToCharArray();
                this.usrtel2 = usrtel2.PadRight(21, '\0').ToCharArray();
                this.usremail = usremail.PadRight(31, '\0').ToCharArray();
                this.usrmobile = usrmobile.PadRight(21, '\0').ToCharArray();
                this.usrvoice = usrvoice.PadRight(21, '\0').ToCharArray();
                this.pwdexpdt = pwdexpdt.PadRight(11, '\0').ToCharArray();
                this.status = status;
                this.createddt = createddt.PadRight(20, '\0').ToCharArray();
                this.createdby = createdby.PadRight(11, '\0').ToCharArray();
                this.updateddt = updateddt.PadRight(20, '\0').ToCharArray();
                this.updatedby = updatedby.PadRight(11, '\0').ToCharArray();
            }
        }        /// <summary>
            /// convert struct to bytes array
            /// </summary>
            /// <param name="obj">struct</param>
            /// <returns>bytes array</returns>
            public static byte[] StructToBytes(object obj)
            {
                int size = Marshal.SizeOf(obj);
                byte[] bytes = new byte[size];            IntPtr structPtr = Marshal.AllocHGlobal(size);
                Marshal.StructureToPtr(obj, structPtr, false);
                Marshal.Copy(structPtr, bytes, 0, size);            Marshal.FreeHGlobal(structPtr);
                return bytes;
           }