C#指針- unsafe與fixed

c#在默認情況下生成的都是安全代碼,即進行了代碼託管(.NET的CLR機制好處之一是 ,進行代碼託管,適時的釋放內存,程序員便不必考慮資源 的回收問題),而此時,指針不能出現在安全代碼的編譯條件下。

  一、unsafe 

如果因需要想在c#中使用指針,那麼unsafe便是一個通道(當然在使用前,需在項目屬性的生成選項中,選擇“允許不安全代碼”)。

example 1:

a) 創建項目,項目屬性->生成->選擇“允許不安全代碼”

b) 編寫代碼

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleDll
{
//此處爲c++動態庫的調用,因 DllC++.dll是示例測試文件,爲不影響代碼演示,此處屏蔽 
//public class Code 
//{ 
// [DllImport("DllC++.dll")] 
// public unsafe static extern int Add(int a, int* b); 
//} 

class Program
{
    public unsafe static int Add(int a, int* b)//此處使用 指針,需要加入非安全代碼關鍵字unsafe 
    {
        return a + *b;
    }

    static void Main(string[] args)
    {    

        unsafe//此代碼塊爲非安全代碼,可以使用指針 
        {
            int resDll,resInner, a;
            int* b;//如果在安全代碼條件下,編譯不會通過對指針的定義 
            a = 1;
            b = &a;
            // resDll = Code.Add(a, b); 
            resInner = Add(a,b);
        }

    }
}


二、fixed

  fixed其實是在非安全代碼下用到纔會有意義的。因爲他負責對指針所指向的“動態分配內存的對象或對象中的成員”簡稱“對象”進行鎖定(之所以要鎖 定,是因爲即使在非安全代碼模式下,這些對象一樣的使用CLR的代碼託管,這樣的話,很可能造成對象的地址變動,就是因爲CLR對資源重新分配的不確定 性,假使指針在未完成對對象的操作時,對象地址變動,那麼指針指向的地址就會出現混亂,很可能造成內存泄漏甚至系統崩潰。如果使用fixed進行鎖定,那 麼只有在執行完fixed模塊後,指針所指向的對象才能被移動)。

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;



namespace ConsoleDll
{

    public static int Add(int[] a,int b)
    {
        unsafe
        {
            fixed (int* pa = a)//此處將鎖住a,使得在fixed操作塊內,a不會被CLR移動 
            {
                return *pa + b;
            }
        }
    }

    static void Main(string[] args)
    {

        int[] a = new int[1];
        a[0] = 1;
        int b = 2;
        int res = Add(a,b);

    }
}

pa的地址也是被固定了的,所以不能對他進行賦值操作!

 

轉載自:http://www.360doc.com/content/10/0618/16/1472642_33815702.shtml



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章