您好,登录后才能下订单哦!
这篇文章主要介绍“MarshalAs的数组的SizeConst有什么作用”,在日常操作中,相信很多人在MarshalAs的数组的SizeConst有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MarshalAs的数组的SizeConst有什么作用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
[StructLayout(LayoutKind.Sequential)] class CLS { public int id; public float value; [MarshalAs(UnmanagedType.ByValArray,SizeConst=10,ArraySubType=UnmanagedType.Struct)] public Point[] ps; [MarshalAs(UnmanagedType.LPStr)] public string msg; [MarshalAs(UnmanagedType.ByValArray,SizeConst=5,ArraySubType=UnmanagedType.LPStr)] public string[] msgs; }
Console.WriteLine("Number of bytes needed by a CLS object:{0}", Marshal.SizeOf(typeof(CLS))); CLS cls = new CLS(); string[] s = new string[10]; for (int i = 0; i < 10;i++ ) { s[i] = "demo" + i; } cls.msgs = s; for(int i=0;i<cls.msgs.Length;i++) { Console.WriteLine(cls.msgs[i]); } Console.WriteLine("Number of bytes needed by a CLS object:{0}", Marshal.SizeOf(typeof(CLS)));
上面程序能正确执行显示:demo0....demo9。两次console.writeline大小值一样112。很不明白的地方就是:
CLS中的msgs已经定义了SizeConst=5,即数量为5个元素的数组大小,而实际代码中string[] s的大小是10个串,也就是说cls.msgs的大小也是10个字符串数组,这不冲突有问题吗???两次writeline数据一样,是不是说明实际在计算大小的时候,这个msgs的真正空间大小并没有计算在内,只计算了SizeConst*一个指向真正地址空间的指针的大小即一般来说指针大小是4个字节(本猜想可以参考https://my.oschina.net/u/2963604/blog/5013061这个实验中的“ 说明:CLS中没有msg和msgs时是88,有msg是92,有msgs是112。 ”来验证)。如果这个猜想是正确的,那我就不明白了,SizeConst=5有什么用呢?反正这个msgs是一个数组,只要知道类型是UnmanagedType.ByValArray,ArraySubType=UnmanagedType.LPSTR/LPWSTR等就可以了,没有必要知道SizeConst。不知有没有人能说得清楚。
到此,关于“MarshalAs的数组的SizeConst有什么作用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。