成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#指針使用簡析

開發 后端
C#指針在.net的時代指針已經被封裝起來為什么還在使用,還能使用呢?本文將向你介紹C#指針的特點等等內容。

C#指針的存在狀況簡析:指針在C\C++里面可是一個好東西,但是到java,.net的時代指針已經被封裝起來,對用戶不可見,這點java做的非常的徹底。.net可能因為還存在一個托管C++,因此指針并沒有完全廢除,C#還是保留了指針的操作。

要使用指針首先要對使用指針的代碼用unsafe進行進行聲明,聲明和public聲明一樣,可以對整個類進行聲明,也可以是類里面某個方法或者屬性。在代碼里什么后,還需要修改工程項目的Build屬性,讓編譯器支持指針的操作。

做好事前的工作就可以使用指針了。指針的使用方法和C++下使用沒有太多差別。只要編譯器不報錯就沒有太大問題。

下面就C#指針來看其他指針的一些使用上的理解:

1. 指針類型可以是實體變量(int,double)也可以是enum,同時也支持結構體變量struct。但不能是類。不過空指針可以指向類,只不過空指針不能進行任何操作,也只能把空指針作為傳遞對象來使用。

2. C#提供一個的關鍵字stackalloc用于申請堆棧內存。注意,這個申請內存分配的是棧內存,當函數執行完畢后,內存會被自動回收。不過我想用這個棧內存基本可以解決40%的問題,而且使用的時候不必擔心內存泄漏問題。

3. .net 好像不直接支持堆內存的申請(這個對.net來說很危險),不過我們可以通過調用win32 api 的方法進行申請。這樣就可以解決剩下40%的問題。堆內存申請的方法在MSDN里面有相關的文檔,具體實現代碼見附。

4.  結構體是一個特殊的對象。他與類的定義就差一個關鍵字,使用方法也和類一樣,可以定義屬性,可以定義方法。但是在進行指針操作的時候雙方就有很大的差別了。結構體可以通過sizeof()取得大小,大小與結構體里有多少實體變量有關,但是如果struck里定義了類的對象,或者指針,sizeof可能會編譯不過(void* 的空指針例外,不過需要在結構體聲明處加上unsafe)。

5. fixed關鍵字:目前了解的不多,不過有一個很實用的例子可以讓指針能夠和.net里的數組進行交互操作: 

  1. byte[] buffer = new byte[100];  
  2. fixed (byte* p = buffer)  
  3. {  
  4.     P[0] = 123;  
  5.     ……  

附C#指針的實現:

  1. public unsafe class Memory  
  2.     {  
  3. // Handle for the process heap.  
  4. // This handle is used in all calls to the  
  5. // HeapXXX APIs in the methods below.  
  6. static int ph = GetProcessHeap();  
  7. // Private instance constructor to prevent instantiation.  
  8. private Memory() { }  
  9. // Allocates a memory block of the given size.   
  10. //The allocated memory is  
  11. // automatically initialized to zero.  
  12. public static void* Alloc(int size)  
  13. {  
  14.     void* result = HeapAlloc(ph, HEAP_ZERO_MEMORY, size);  
  15.     if (result == nullthrow new OutOfMemoryException();  
  16.     return result;  
  17. }  
  18. // Copies count bytes from src to dst.   
  19. //The source and destination  
  20. // blocks are permitted to overlap.  
  21. public static void Copy(void* src, void* dst, int count)  
  22. {  
  23.     byte* ps = (byte*)src;  
  24.     byte* pd = (byte*)dst;  
  25.     if (ps > pd)  
  26.     {  
  27. for (; count != 0; count--) *pd++ = *ps++;  
  28.     }  
  29.     else if (ps < pd)  
  30.     {  
  31. for (ps += count, pd += count;   
  32. count != 0; count--) *--pd = *--ps;  
  33.     }  
  34. }  
  35. // Frees a memory block.  
  36. public static void Free(void* block)  
  37. {  
  38.     if (!HeapFree(ph, 0, block))   
  39. throw new InvalidOperationException();  
  40. }  
  41. // Re-allocates a memory block.   
  42. //If the reallocation request is for a  
  43. // larger size, the additional region of memory is automatically  
  44. // initialized to zero.  
  45. public static void* ReAlloc(void* block, int size)  
  46. {  
  47.     void* result = HeapReAlloc(ph, HEAP_ZERO_MEMORY, block, size);  
  48.     if (result == nullthrow new OutOfMemoryException();  
  49.     return result;  
  50. }  
  51. // Returns the size of a memory block.  
  52. public static int SizeOf(void* block)  
  53. {  
  54.     int result = HeapSize(ph, 0, block);  
  55.     if (result == -1) throw new InvalidOperationException();  
  56.     return result;  
  57. }  
  58. // Heap API flags  
  59. const int HEAP_ZERO_MEMORY = 0x00000008;  
  60. // Heap API functions  
  61. [DllImport("kernel32")]  
  62. static extern int GetProcessHeap();  
  63. [DllImport("kernel32")]  
  64. static extern void* HeapAlloc(int hHeap, int flags, int size);  
  65. [DllImport("kernel32")]  
  66. static extern bool HeapFree(int hHeap, int flags, void* block);  
  67. [DllImport("kernel32")]  
  68. static extern void* HeapReAlloc(int hHeap, int flags,  
  69.    void* block, int size);  
  70. [DllImport("kernel32")]  
  71. static extern int HeapSize(int hHeap, int flags, void* block);  
  72.     } 

C#指針方面的內容就向你介紹到這里,希望對你了解學習C#指針有所幫助。

【編輯推薦】

  1. C#結構體構造函數的應用
  2. C#結構體定義的詳解
  3. C#的結構體使用實例淺析
  4. C#結構體變量學習淺談
  5. 解析C#結構體指針
責任編輯:仲衡 來源: 編程論壇
相關推薦

2009-08-13 10:27:28

C#讀取Excel數據

2009-09-03 17:10:57

2009-08-12 10:07:51

C#運算符

2009-09-03 14:20:21

C#日期格式化

2009-09-03 10:52:41

C#遞歸樹

2009-08-12 16:38:35

C#讀取XML節點

2009-08-13 14:36:40

C#結構體構造函數

2009-08-19 12:58:19

C#操作Word

2009-08-18 17:29:02

C#使用指針

2009-08-20 16:02:15

C#正則表達式

2009-08-21 15:16:23

C#使用指針

2009-09-09 18:41:42

C# 加密散列算法

2009-08-20 09:58:06

C#操作文本文件

2024-12-23 09:09:54

2010-01-20 14:25:56

函數調用

2010-01-25 10:10:42

C++函數參數

2011-07-12 14:04:58

2010-01-18 15:53:27

C++析構函數

2009-09-02 10:49:46

C#調用析構方法

2009-07-30 15:24:13

C#析構函數C#構造函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人国产精品色哟哟 | 国产情侣一区 | 精品一区国产 | 日韩在线观看网站 | 亚洲视频免费在线观看 | 久久激情视频 | 99久久精品免费看国产小宝寻花 | 国产区在线 | 国产精品一码二码三码在线 | 精品一区二区三区四区五区 | 亚洲欧美一区二区在线观看 | 国产超碰人人爽人人做人人爱 | 99久久精品免费看国产免费软件 | 国产精品一区二区视频 | 一区二区三区中文字幕 | 91精品国产91综合久久蜜臀 | 日本精品一区二区 | 国产精品久久久久久久久动漫 | 国产日韩欧美中文字幕 | 国产在线视频在线观看 | 久久久久久久久国产精品 | 成人免费小视频 | 精品国产亚洲一区二区三区大结局 | 日本超碰 | 日韩中文字幕 | 99免费在线视频 | 综合国产| 亚洲一区二区三区在线播放 | 国产一区二区精 | 国产精品一区二区视频 | 精精国产xxxx视频在线播放7 | 国产在线精品一区二区 | 欧美一级片在线看 | 四虎影院免费在线 | 国产成人免费在线观看 | 国产精品久久国产愉拍 | 国产专区免费 | 国产精品精品视频 | 日韩精品一区二区三区久久 | 日本二区在线观看 | a级毛片免费高清视频 |