当前位置:编程学习 > C#/ASP.NET >>

在C#.net中使用指针

最近在做将Fortran语言移植到C#.net中的工作,由于Fortran是一个用来科学计算的语言,其中大量使用了数组且其操作绝大多数都是对数组的读写操作。而熟悉.net框架的人都知道,当我们访问数组中的元素时,CLR会先检查索引是否超出了数组的上下界,若超出了,则会抛出System.IndexOutOfRangeException异常。而正是由于这层“保姆程序”,使得.NET程序中对数组操作时无可避免地会有一些性能方面的代价。我们今天要做的事情就是直接跳过这层“保姆程序”,使用指针直接对数组中的元素进行操作。

  为了在程序中使用指针,我们需要标示非安全代码,需要使用特殊的关键字unsafe。

  非安全代码是一种介于托管代码和非托管代码之间的一种代码类型,它能像托管代码一样在CLR的管理下执行,又能像非托管代码一样允许你使用指针直接操作内存。具体来说,凡是使用了*、&、->这些C语言中常用到的任一指针操作符的语句、语句块或函数都称为非安全代码。

  实例如下:

  unsafe void SquarePtrParam(int* p)
        {
            *p *= *p;
        }

 

  由于CLR管理下的代码中存在内存重定位的问题,所以为了避免内存泄露,我们需要在语句块前输入关键字fixed(其功能就是禁止垃圾回收器重定位可移动的变量),告诉CLR该语句块中的对象或变量不能重定位。

 

  具体的实现过程如下:

  在开发环境中设置编译器选项:打开项目的“属性”页——>单击“生成”页——>选中“允许不安全代码”复选框

  可行实例代码如下:  

public class QuikeArrayRead
    {
        unsafe void SquarePtrParam(int* p)
        {
            *p *= *p;
        }

        public unsafe void run()
        {
            int[] arr = new int[] { 1, 2, 3, 4, 5 };
            fixed (int* p = &arr[0])
            {
                for (int i = 0, n = arr.Length; i < n; i++)
                {
                    SquarePtrParam(p+i);
                    Console.WriteLine(p[i]);
                }
            }
        }
 }

    
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,