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