1. 程式人生 > >18.C#基礎之不安全程式碼(在整理當中)

18.C#基礎之不安全程式碼(在整理當中)

     前面有寫到過,核心C#語言沒有將指標引入它所支援的資料型別,從而與C和C++有著顯著的區別。作為代替,C#提供了各種引用型別,並能建立可由垃圾回收器管理的物件。這就使得C#比C或C++安全的多。

     在核心C#語言中,乾脆就不可能有未初始化的變數、"虛"、超過陣列邊界對其進行索引的表示式,這樣C和C++的一系列錯誤就不會發生在C#中。但儘管如此,但仍有一些場合需要指標型別。例如與底層作業系統進行互動、訪問記憶體對映裝置,或實現一些以時間為關鍵的演算法時,沒有指標就很難完成,為了應對這種情況,C#提供了編寫不安全程式碼的能力。

     在不安全程式碼中,可以宣告和操作指標,可以在指標和整型間執行轉換,還可以獲取變數的地址等,從某種意義上說,編寫不安全程式碼就像在C#程式中編寫C程式碼。雖然它的名字時不安全程式碼,但無論從開發人員還是使用者角度,不安全程式碼事實上都是一種"安全"功能。

     不安全程式碼必須用修飾符unsafe明確標記。

  18.1不安全上下文

     C#的不安全功能僅用於不安全上下文,不安全上下文是通過在型別或成員的宣告中包含一個unsafe修飾符或通過使用不安全程式碼引入:

       *在類、結構、介面或委託的宣告可以包含unsafe修飾符,在這種情況,該型別宣告的整個文字範圍被認為是不安全上下文;

       *欄位、方法、屬性、事件、索引器、運算子、例項建構函式、解構函式、靜態建構函式的宣告包含unsafe,即該成員在整個文字範圍是不安全上下文;

       *不安全語句使得可以在塊內使用不安全上下文,該語句關聯的塊的整個文字範圍被認為是不安全上下文。

     上面就是在結構宣告中指定unsafe,所以可以使用指標型別。還可以這麼寫:

     這樣欄位被認為是不安全上下文。unsafe除了建立不安全上下文從而使用指標型別外,對型別和成員沒有其他影響。比如:

     A類使用unsafe修飾符,B類繼承重寫F時,不用重新指定unsafe修飾符。除非B中的F方法本身需要訪問不安全功能。但指標是方法簽名的一部分時:

  18.2指標型別

     發