C#编写执行unsafe代码入门

  • 原创
  • |
  • 浏览:10843
  • |
  • 更新:
  • |
  • 标签:编程语言 

介绍使用C#编写unsafe代码:比如指针操作,无边界检查的数组操作,与一些其他语言编写的模块交互等不安全代码。介绍unsafe有关设置以及简单示例。

工具/原料

  • C# (Visual Studio 2015)(08/10/12/13/15/17均兼容)
  • .net 2.0+

方法/步骤

  1. 1

    默认情况下,C#是不允许不安全代码的,unsafe声明出错。因此首先需要修改设置。

    C#编写执行unsafe代码入门
  2. 2

    在菜单栏,找到项目->属性,在属性面板找到生成选项卡,勾选允许不安全代码。

    C#编写执行unsafe代码入门
    C#编写执行unsafe代码入门
  3. 3

    然后我们就可以编写不安全代码了。unsafe关键字可以修饰一个语句块,语句块内可以支持指针类型,有指针操作,无边界检查等。

    如图,bitData.Scan0是一个IntPtr类型,在unsafe代码块中把该指针类型转换为byte*,进行指针操作。

    C#编写执行unsafe代码入门
  4. 4

    unsafe关键字还可以修饰函数,类等。被修饰的域将允许不安全代码。

    如图编写了一个unsafe的函数,传入参数有一个char*指针。

    另外,如果要获取变量的指针,需要放入fixed语句获取指针。fixed必须在unsafe内部使用,用于固定指针指向的变量,避免运行时环境将变量挪动位置。

    如图,在fixed语句块中,获取一个指向string类型字符串数据的char*指针,接着调用unsafe的函数修改字符串。

    C#编写执行unsafe代码入门
  5. 5

    C#在调用一些API和别的程序模块时,也常常需要指针。C#有一个类型IntPtr,常用来传递指针类型,读者可自行了解。

    C#编写执行unsafe代码入门
  6. 6

    如图,C#调用Managed DirectX库的时候,如果要获取比如VertexBuffer的某些指针成员,就必须在unsafe中使用。

    C#编写执行unsafe代码入门
  7. 6
    该信息非法爬取自百度经验
  8. 7

    C#和C++的函数指针有挺大的区别,C#中使用托管来传递函数,也使用托管向CPP模块传递函数指针。如图,是托管的简单用例。

    红框内的属性是为了传给CPP模块,图中并未演示向CPP传函数指针,因此不需要这个属性。

    C#编写执行unsafe代码入门
    END

注意事项

  • unsafe必须谨慎使用,而且很多时候是不需要unsafe的。通常只有在对性能要求高和与其它模块交互需要用到这个。
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部
相关标签编程语言