不安全代码
介绍
C#中可以像C++一样使用指针进行内存操作,包含指针操作的代码为不安全代码。
由于直接操作内存,效率一般更高。可指定类型
- 任何整形类型
- 任何浮点型类型
- 字符
- 布尔型
- 小数
- 任何枚举类型
- 任何指针类型
- 任何仅包含非托管类型字段的用户定义的结构类型
注意
指针类型不从对象继承,并且指针类型与 object 之间不存在转换。 此外,装箱和取消装箱不支持指针。 但是,你可在不同的指针类型之间以及指针类型和整型之间进行转换。指针不能指向引用或包含引用的结构,因为无法对对象引用进行垃圾回收,即使有指针指向它也是如此。 垃圾回收器并不跟踪是否有任何类型的指针指向对象。
一般声明方式
- int* p :p 是指向整数的指针。
- int** p :p 是指向整数的指针的指针。
- int*[] p :p 是指向整数的指针的一维数组。
- char* p :p 是指向字符的指针。
- void* p : p 是指向未知类型的指针。
设置编译器
VS
参考命令行编译:
csc -unsafe prog1.cs 、csc /unsafe prog1.csUnity中:
File->Build Settings->Player Settings->Other Settings->Allow “unsafe” Code
unsafe关键字
- 在成员名前面修饰
unsafe int* val
unsafe void Dosomething(){ … } - 直接使用代码块
unsafe { … }
- 在成员名前面修饰
fixed关键字
由于C#中声明的变量在内存中的存储受垃圾回收器管理;因此一个变量(例如一个大数组)有可能在运行过程中被移动到内存中的其他位置。使用fixed关键字来固定变量位置不移动。
fixed(int *ptr = int[5]) {//…}stackalloc
在unsafe不安全环境中,我们可以通过stackalloc在堆栈上分配内存,由于在堆栈上分配的内存不受内存管理器管理,因此其相应的指针不需要固定。
int *ptr = stackalloc int[1] ;符号
可对指针执行的运算符
运算符 | 作用 |
---|---|
* | 执行指针间接寻址 |
-> | 通过指针访问结构的成员 |
[] | 为指针建立索引 |
& | 获取变量的地址 |
++ 和 – | 递增和递减指针 |
| 执行指针算法 |
==、!=、<、>、<= 和 >= | 比较指针 |