电脑安全代码是什么意思 C#之不安全代码(1)
C#之不安全代码(1)
主要参考的是C# Language Specification Version
引子
C#是 Net平台上主流的开发语言 和经典的C/C++不同的是 C#所编写的代码是托管代码 由GC来管理内存 省去了new/delete的烦恼 但是 由于某些特殊的要求 比如和底层的操作系统接口 访问内存映射设备或者实现对时间要求苛刻的算法时 C#提供了不安全代码
不安全上下文
不安全代码只能写在不安全上下文中
通过unsafe 修饰符可以修饰
class struct interface or delegate
field method property event indexer operator instance constructor destructor or static constructor
unsafe statement block 指针的类型
在不安全上下文中 指针类型和引用类型或是值类型一样 但是 指针类型可以用在不安全上下文之外的typeof中 虽然这么做不安全
Type t = typeof(Int *) 返回的是System Int *
指针类型是用非托管类型或是void加上*来表示的 pointer type:unmanaged type *void *
unmanaged type:type 在*前面的指针类型被称为指针类型的引用类型 它表明了指针变量的值指向的变量的类型
非托管类型不是引用类型 也不包含任何嵌套的引用类型的成员
非托管类型就是下面的一种
sbyte byte short ushort int uint long ulong char float double decimal or bool
Any enum type
Any pointer type
Any user defined struct type that contains fields of unmanaged types only
例子 Example Description byte* Pointer to byte char* Pointer to char int** Pointer to pointer to int int*[] Single dimensional array of pointers to int void* Pointer to unknown type
和C/C++不同的是 声明多个指针变量需要
int *p *p
但是在C#中 int* p p 就声明了两个指针变量 并且*是在类型之后 不是在变量名之前
和引用类型相同的是 指针可以为null(所有位为 ) 如果访问一个指向null的指针会引发不可预知的结果
Void* 表示一个指针指向未知类型 因为指向未知类型 所以不能通过*来访为指向的变量 也不能对指针进行数学运算 但是 void*可以转换为任何指针类型 反之亦然
指针类型是一个单独的类型 指针类型不是继承自System Object 并且两者也不能互相转换 同样装箱和拆箱也不适合指针类型 但是不同类型指针之间可以互相转换
指针类型不能用于类型参数 当泛型方法的类型参数为指针类型会调用失败
指针类型还可用于易变字段类型
虽然指针还能通过ref和out来传递 但是会造成不可预知的行为 当指针指向一个已经不存在的本地变量 或是指向一个实际不再固定的固定对象 比如 using System;
class Test{ static int value = ;
unsafe static void F(out int* pi ref int* pi ) { int i = ; pi = &i;
fixed (int* pj = &value) { // pi = pj; } }
static void Main() { int i = ; unsafe { int* px ; int* px = &i;
F(out px ref px );
Console WriteLine( *px = { } *px = { } *px *px ); // undefined behavior } }} 方法可以返回指针类型 unsafe static int* Find(int* pi int size int value) { for (int i = ; i < size; ++i) { if (*pi == value) return pi; ++pi; } return null;} 主要有几个操作符
· *被用作间接访问
· >被用作通过指针来访为结构的成员
· []用来做指针的索引器

· &用来获得变量的地址
· ++和—用来自增和自减指针
· +和 用来做指针的算术运算
· == != < > <= and =>用来比较指针
· stackalloc可以从栈上分配内存
lishixinzhi/Article/program/net/201311/11442