這篇文章主要講解了“Marshal.SizeOf是如何計算大小的”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Marshal.SizeOf是如何計算大小的”吧!

目前創(chuàng)新互聯(lián)公司已為數千家的企業(yè)提供了網站建設、域名、網頁空間、綿陽服務器托管、企業(yè)網站設計、臺安網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
今天發(fā)現(xiàn)一個C#的怪現(xiàn)象:
string[] msgs = { "zs", "li", "wu" };
int sizeoflen = Marshal.SizeOf(msgs);
IntPtr pmsgs = Marshal.AllocHGlobal(sizeoflen);
結果發(fā)現(xiàn)Marshal.SizeOf(msgs)這一句出現(xiàn):ArgumentException類型的未經處理的異常在mscorlib.dll中發(fā)生,其它信息:String[]不能作為非托管結構進行封送處理:無法計算有意義的大小或偏移量。如何換成int sizeoflen = Marshal.SizeOf(msgs[0]);也是異常:String不能作為非托管結構進行封送處理:無法計算有意義的大小或偏移量。
但是如果有:
[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;
}
CLS[] clss = new CLS[2];
int clsslen = Marshal.SizeOf(clss);
也是出現(xiàn)類似上面的CLS[]異常;修改為
int clsslen = Marshal.SizeOf(clss[0]);則出現(xiàn):AugumentNullException類型的未經處理的異常:值不能為null。再次修改為
clss[0] = new CLS();
clss[1] = new CLS();
int clsslen = Marshal.SizeOf(clss);還是出現(xiàn):CLS[]異常;再修改為針對一個成員對象:
int clsslen = Marshal.SizeOf(clss[0]);則成功出現(xiàn)值大小。
這說明要想計算CLS[] clss的真正大小,可以用一個成員的大小再乘以元素數量。
回到最開始的string[] msgs = { "zs", "li", "wu" };上來說,最終實驗發(fā)現(xiàn)不管是用Marshal.SizeOf(msgs)還是用Marshal.SizeOf(msgs[0])都是無法計算大小的異常。由此可以總結出來:
string或string[]要想計算大小,是不可能通過Marshal.SizeOf來得到結果的。
其它的包括struct值類型(struct需要StructLayout屬性進行限定)在內是可以通過Marshal.SizeOf獲得大小的,基礎值類型可以用sizeof獲得;引用類型則可以通過Marshal.SizeOf獲得,但數組不能直接獲得,需要先初始化數組的成員,然后Marshal.SizeOf(一個成員對象變量)的結果再乘以數組長度就是總內存大小。
感謝各位的閱讀,以上就是“Marshal.SizeOf是如何計算大小的”的內容了,經過本文的學習后,相信大家對Marshal.SizeOf是如何計算大小的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!
網頁標題:Marshal.SizeOf是如何計算大小的
本文地址:http://chinadenli.net/article36/ppcppg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、網站營銷、網站制作、搜索引擎優(yōu)化、響應式網站、商城網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)