c#指针
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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#指针的主要内容,如果未能解决你的问题,请参考以下文章
此 Canon SDK C++ 代码片段的等效 C# 代码是啥?