【C# 線程】IntPtr 類


IntPtr類由來

.NET提供了一個結構體System.IntPtr專門用來代表句柄或指針。句柄是對象的標識符,當調用這些API創建對象時,它們並不直接返回指向對象的指針,而是會返回一個32位或64位的整數值,這個在進程或系統范圍內唯一的整數值就是句柄(Handle),隨后程序再次訪問對象,或者刪除對象,都將句柄作為Windows API的參數來間接對這些對象進行操作。

個人理解

句柄指向就是指向文件開頭,在windows系統所有的東西都是文件,對象也是文件。所以句柄和指針是一樣的意思。句柄是面向對象的指針的稱呼。

指針是對存儲區域的引用,該區域包含您感興趣的一些數據。指針是面向過程編程的稱呼。

句柄指向就是指向文件開頭,在windows系統所有的東西都是文件,對象也是文件。所以句柄和指針是一樣的意思。句柄是面向對象的指針的稱呼。

指針是對存儲區域的引用,該區域包含您感興趣的一些數據。指針是面向過程編程的稱呼。

gain

intPtr類是intPointer的縮寫。C#中用來取代指針,也可以說對指針進行封裝。指向托管內存.
它也不常用,因為C#項目中指針都被棄用了,那指針的封裝—句柄自然也被棄用了。
但總有特殊的地方會用到指針,比如調用C++動態庫之類的;所以微軟貼心的為我們做了個句柄,畢竟指針用起來太難受了。
句柄是一個結構體,簡單的來說,它是指針的一個封裝,是C#中指針的替代者,下面我們看下句柄的定義。

 

 

從圖中我們可以看到,句柄IntPtrt里包含創建指針,獲取指針長度,設置偏移量等等方法,並且為了編碼方便還聲明了些強制轉換的方法。
看了句柄的結構體定義,相信稍微有點基礎的人已經明白了,在C#中,微軟是希望拋棄指針而改用更優秀的intPtr代替它的。
但我們還會發現,句柄里還提供一個方法是ToPointer(),它的返回類型是Void*,也就是說,我們還是可以從句柄里拿到C++中的指針,既然,微軟期望在C#中不要使用指針,那為什么還要提供這樣的方法呢?
這是因為,在項目開發中總是會有極特殊的情況,比如,你有一段C++寫的非常復雜、完美的函數,而將這個函數轉換成C#又及其耗時,那么最簡單省力的方法就是直接在C#里啟用指針進行移植。
也就是說,C#支持指針,其實是為了體現它的兼容性,並不是提倡大家去使用指針。

 使用場合:

1.C#中的IntPtr類型被稱之為“平台特定的整數類型”,用於本機資源,例如窗口句柄。
2.資源的大小取決於使用的硬件和操作系統,即此類型的實例在32位硬件和操作系統中將是32位,在64位硬件和操作系統中將是64位;但其大小總是足以包含系統的指針(因此也可以包含資源的名稱)。
3.在調用API函數時,類似含有窗口句柄參數(HANDLE)的原型函數,應顯示地聲明為IntPtr類型。
4.IntPtr類型對多線程操作是安全的。
5. int 和IntPtr互轉

案例:結構體封裝成Ptr引用:

1 BVCU_PUCFG_GPSData gpsData; 2 IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(BVCU_PUCFG_GPSData))); 3 Marshal.StructureToPtr(gpsData, pt, true);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM