91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Marshal.SizeOf是如何計算大小的

發布時間:2021-10-13 15:01:49 來源:億速云 閱讀:254 作者:iii 欄目:編程語言

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

今天發現一個C#的怪現象:
string[] msgs = { "zs", "li", "wu" };
int sizeoflen = Marshal.SizeOf(msgs);
IntPtr pmsgs = Marshal.AllocHGlobal(sizeoflen);
結果發現Marshal.SizeOf(msgs)這一句出現:ArgumentException類型的未經處理的異常在mscorlib.dll中發生,其它信息: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);
也是出現類似上面的CLS[]異常;修改為
int clsslen = Marshal.SizeOf(clss[0]);則出現:AugumentNullException類型的未經處理的異常:值不能為null。再次修改為 
clss[0] = new CLS();
clss[1] = new CLS();
int clsslen = Marshal.SizeOf(clss);還是出現:CLS[]異常;再修改為針對一個成員對象:
int clsslen = Marshal.SizeOf(clss[0]);則成功出現值大小。
這說明要想計算CLS[] clss的真正大小,可以用一個成員的大小再乘以元素數量。
回到最開始的string[] msgs = { "zs", "li", "wu" };上來說,最終實驗發現不管是用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是如何計算大小的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

株洲市| 漠河县| 南汇区| 宁夏| 乌兰察布市| 鹤岗市| 高邮市| 博乐市| 宁陕县| 偃师市| 扎囊县| 唐河县| 石柱| 分宜县| 无极县| 郓城县| 阿克陶县| 鄂托克旗| 登封市| 格尔木市| 鸡泽县| 松溪县| 建瓯市| 胶南市| 莱州市| 海林市| 海安县| 肇州县| 称多县| 湘潭县| 望江县| 历史| 台北市| 威信县| 万载县| 浦北县| 无棣县| 莫力| 麦盖提县| 合水县| 呼伦贝尔市|