1、默认情况下,C#是不允许不安全代码的,unsafe声明出错。因此首先需要修改设置。
2、在菜单栏,找到项目->属性,在属性面板找到生成选项卡,勾选允许不安全代码。
3、然后我们就可以编写不安全代码了。unsafe关键字可以修饰一个语句块,语句块内可以支持指针类型,有指针操作,无边界检查等。如图,bitData.Scan0是一个朐袁噙岿IntPtr类型,在unsafe代码块中把该指针类型转换为byte*,进行指针操作。
4、unsafe关键字还可以修饰函数,类等。被修鹘埙沃础饰的域将允许不安全代码。如图编写了一个unsafe的函数,传入参数有一个char*指针。另外,如果要获取变量的指针,需要放入fixed语句获取指针。fixed必须在unsafe内部使用,用于固定指针指向的变量,避免运行时环境将变量挪动位置。如图,在fixed语句块中,获取一个指向string类型字符串数据的char*指针,接着调用unsafe的函数修改字符串。
5、C#在调用一些API和别的程序模块时,也常常需要指针。C#有一个类型IntPtr,常用来传递指针类型,读者可自行了解。
6、如图,C#调用Managed DirectX库的时候,如果要获取比如VertexBuffer的某些指针成员,就必须在unsafe中使用。
7、C#和C++的函数指针有挺大的区别,C#中使用托管来传递函数,也使用托管向CPP模块传递函数指针。如图,是托管的简单用例。红框内的属性是为了传给CPP模块,图中并未演示向CPP传函数指针,因此不需要这个属性。