概述C#使用指針
這是C/C++程序迷們經常談論的一個話題,同時也是一個復雜的、難以理解的話題-指針!每次談到C#,大多數我遇到的人都持這樣的觀點-C#中沒有指針的概念。而實際上,它已經被廢除了,取而代之的是C#中的非安全編程-如何在程序中使用指針。不同于其字面意思的是,C#使用指針編程并沒有什么不安全的。
它如此受關注的根本原因是,非安全編程不同于習慣的.NET開發規范,而需要編程人員進行明確定本地環境設置(僅適用于本地執行)。本文我將從區別兩個最容易被疑惑的概念-非安全代碼與非受控代碼開始討論非安全編程這個主題。接下來我們將討論如何編寫非安全代碼,亦即如何在C#使用指針。
非安全還是非受控?
受控代碼是指在CLR管理下執行的代碼。CLR負責了許多幕后的工作:
◆管理對象的內存
◆進行類型驗證
◆垃圾回收
說了這些,實際就是要將用戶從上述的這些工作中解脫出來了,專心于業務實現。用戶不再需要直接手工地進行內存操作,因為這些工作已由CLR完成了。
另一方面,非受控代碼就是在CLR上下文外執行的代碼了。最好的例子就是我們平時使用的Win32 DLL,比如kernel32.dll,user32.dll以及安裝上我們系統上的各種COM組件。如何為它們分配內存、如何釋放這些內存、如何實現類型驗證?這些工作都需要它們自己來完成。一個典型的C++程序中分配一個字符指針的語句也是非受控代碼的另一類例子,因為作為一名編程者,你要負責:
◆調用內存分配函數
◆確保類型轉換的結果正確
◆確保指針在使用完畢后其內存被釋放
如果你留心上面的解釋,所有這些工作都是由CLR來完成以減輕編程者的負擔。
非安全代碼是介于受控與非受控代碼間的一種代碼類型
非安全代碼仍然象受控代碼一樣是在CLR的管理下執行的,但在同時它又象非受控代碼一樣允許你通過指針直接訪問內存。因此你獲得了兩者的優點。如果你正在編寫寫一個.NET應用程序,但同時又希望可以廣泛使用Win32 DLL中的各種函數-需要C#使用指針的,那么此時非安全代碼就是你的救星了。
我們已經明確了兩者的區別后,就開始編寫實際的代碼,毫無疑問,這才是最精彩的部分,你還在想什么呢?
深入非安全代碼
編寫非安全代碼需要使用特殊的關鍵字unsafe與fixed。如果你還記得的話,有三種指針操作符:* & ->
【編輯推薦】