首页 > 代码库 > c#指针

c#指针

<1>为什么要使用指针?

一是向后兼容性:c#非常擅长对开发人员隐藏大部分基本内存管理,因为它使用了垃圾回收器和引用,但是有时需要直接访问内存,例如由于性能问题,需要在外部(非.net环境)的DLL中访问一个函数,该函数需要把指针当作参数来传递(许多windows API函数就是这个样子);二是性能:在一些情况下,速度是最重要的,而指针可以提供最优性能;

<2>其实引用就相当于一个类型安全的指针,指针只是以一个与引用相同的方式存储地址的变量,其区别是c#不允许直接访问在引用变量中包含的地址;要使用关键字unsafe特别标记的代码块才能使用指针,任何方法都可以标记为unsafe的,成员变量也可以标记为unsafe,也可以把方法中的一块代码标记为unsafe;

<3>指针的语法:

指针的语法基本上和c语言c++的一样,注意不能创建指向任何一个引用类型的指针,因为垃圾回收器只会维护关于引用的信息,不会维护关于指针的任何信息,因此创建指向类的指针会使垃圾回收器不能正常工作;但是可以创建指向类成员的指针,要使用fixed关键字

Myclass myObject=new Myclass();
fixed(long* pObject=&(myObject.x))
{
     //do something
}

<4>指针的另一个应用领域是创建高性能,低系统开销的数组因为c#数组实际上都是一个对象,它们是System.Array的实例,因此数组存储到堆上,占用了系统的开销,有时我们希望创建一个使用时间比较短的高性能数组,不希望有引用对象的系统开销,这时可以使用指针来创建;需要使用stackalloc关键字;但是要注意一点

double* pDoubles=stackalloc double[20];
pDoubles[50]=3.0;

这时采用越界的下标来访问数组,不会抛出异常,可能会改变有用的信息;

c#指针