1.为何要有unsafe

也许是为了实现CLR类型安全的目标吧,默认情况下,C#没有提供指针的使用算法,但是有些情况下也可能需要指针这样直接访问内存的东西(虽然目前我还没有用过),但是有时候程序员非常清楚程序的运行状况,需要使用指针直接访问内存以便于提高性能或者调试、监控程序运行的内存的使用状况,以便于采取相应的措施。还有一些情况是当我们需要调用外面DLL中的函数又不能使用DllImport 时,也需要指针来传递这些函数。

2.unsafe 的定义

    MSDN:unsafe 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。

其实,意思就是要使用指针前,请用unsafe 声明下,可以使类、方法,成员,类全局变量和代码段,但不能修饰成员函数内部的局部变量,具体为什么不清楚,还望大神指点。

  在使用unsafe之前,我们必须先看一段MSDN的话:在公共语言运行时 (CLR) 中,不安全代码是指无法验证的代码。 C# 中的不安全代码不一定是危险的;只是其安全性无法由 CLR 进行验证的代码。 因此,CLR 只对在完全受信任的程序集中的不安全代码执行操作。 如果使用不安全代码,由您负责确保您的代码不会引起安全风险或指针错误。

因此,我们在运行unsafe 代码是要在项目属性-生成选项里配置下"允许运行不安全代码"。先看下简单的例子:

unsafe static void ChangeValue(int* pData)
{
   *pData = 200; //修改所在地址值
}

unsafe static void Main()
{
   int data = 100;
  Console.WriteLine("原始值: {0}", data);
  ChangeValue(&data); //取data地址并传递
  Console.WriteLine("改变地址后: {0}", data);

Console.ReadLine();
}

程序输出:  原始值:100 ;  修改地址后:200

3、引入fixed

当我们讨论fixed的时候,不得不先了解下,托管代码和非托管代码,所谓托管代码就是由CLR去执行的代码而不是操作系统去执行的代码,而非托管代码就是绕过CLR,由操作系统直接执行,它有自己的垃圾回收、类型安全检查等服务。

而不安全代码就是允许自己使用指针访问内存,但同时又要使用CLR提供的垃圾回收机制、类型安全检查等服务,有的资料认为是介于CLR和非托管代码之间的一种代码运行机制,也可以理解。

正因为如此,我们自定义的指针地址就有可能被CLR垃圾回收机制重新调整位置,所以就引入了fixed ,MSDN对fixed的解释是:fixed 语句设置指向托管变量的指针,并在执行该语句期间"固定"此变量。这样就可以防止变量的重定位。

看下代码的演示:

class PointerDemo
{
  public int x, y;
}
class Program
{
  unsafe static void ChangeValue(int* x, int* y)
  {
    *x = 200; //修改所在地址值
    *y = 300;
  }
  unsafe static void Main()
  {
    var obj = new PointerDemo();
    Console.WriteLine("原始值: {0}, {1}", obj.x, obj.y);
    fixed (int* n = &obj.x)
    {
      fixed (int* p = &obj.y)
      {
        ChangeValue(n, p); //取data地址并传递
      }
    }
    Console.WriteLine("改变地址后: {0}, {1}", obj.x, obj.y);
    Console.ReadLine();
  }
}

C#基础—不安全代码(unsafe code)相关推荐

  1. C# Unsafe code may only appear if compiling with /unsafe

    C#调试程序,提示:Unsafe code may only appear if compiling with /unsafe 解决方法: 右击项目 - 属性 - 构建 - 勾选"允许不安全 ...

  2. LaTeX 使用minted进行代码高亮 Code Highlighting

    LaTeX 使用minted进行代码高亮 Code Highlighting 原  文:Code Highlighting with minted 译  者:Xovee 翻译时间:2022年10月2日 ...

  3. 计算机软件技术代码,计算机软件技术基础VisualBasic程序设计代码.ppt

    计算机软件技术基础VisualBasic程序设计代码 Visual Basic6.0程序设计 课 程 简 介 1.课程简介:Visual Basic是按照高等院校教学 需要开设的课程,详细介绍Visu ...

  4. 经典c语言基础代码大全,10个经典的C语言面试基础算法及代码

    <10个经典的C语言面试基础算法及代码>由会员分享,可在线阅读,更多相关<10个经典的C语言面试基础算法及代码(24页珍藏版)>请在人人文库网上搜索. 1.10个经典的C语言面 ...

  5. 送书 | 你一定能看懂的算法基础书(代码示例基于Python)

    本文引自图灵教育<算法图解> 你一定能看懂的算法基础书:代码示例基于Python:400多个示意图,生动介绍算法执行过程:展示不同算法在性能方面的优缺点:教会你用常见算法解决每天面临的实际 ...

  6. 灵异事件 !同一个代码在code::blocks和Dev上面运行结果不一样!(一番分析后找到原因!)

    我今天在code的时候发现了一个灵异事件 !同一个代码在code::blocks和Dev上面运行结果不一样! 如图,同一个代码文件在两个编译器上的输出不同: 同样的代码在code::blocks上输出 ...

  7. 图像滤镜艺术--编码基础(Photoshop基础变换的代码实现)

    原文:图像滤镜艺术--编码基础(Photoshop基础变换的代码实现) 自从上一篇博客写完之后,到现在已经有段时间了,这段时间不是不想接着写,只是想做的更好了在写出来给大家看呵呵. 今天,我将给大家介 ...

  8. java native code_原生代码(native code)

    原生代码(native code) Native code is the code whose memory is not "managed", as in, memory isn ...

  9. 洛谷 P3102 [USACO14FEB]秘密代码Secret Code

    P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...

最新文章

  1. 2022-2028年中国液晶电视市场投资分析及前景预测报告
  2. python支持的数据类型float_Python基本数据类型之int 、 float
  3. 跨平台 获取系统信息的python库 http://support.hyperic.com/disp
  4. 第11天学习Java的笔记(数组注意事项)
  5. Android开发之跨进程通讯-AIDL实现方法 (附源码)
  6. input标签的值只能两位小数_Day51 HTML表格表单标签、flask框架
  7. MATLAB课程表分配问题,求助matlab大神,学校的课程安排太骚了,我们压根就不用学matlab...
  8. 十个Java基础面试题(附答案)
  9. 游戏match(【CCF】NOI Online能力测试2 提高组第三题 )
  10. Lucene使用Filter搜索过滤
  11. 学习单片机开发——浅尝点灯的快乐
  12. Mac Photoshop CS6 安装教程
  13. java oa系统二次开发_浅谈OA系统的二次开发
  14. play_framework框架--教程(一)
  15. java 运算符的讲解
  16. 广汉哪里可以学计算机,广汉的年轻人学门啥技术好找工作呢
  17. ios CAShapeLayer
  18. 如何高效过滤游戏中的敏感词?
  19. 联想高志国:超融合已进入2.0时代
  20. 豆瓣Top250电影爬虫

热门文章

  1. UA PHYS515A 电磁理论V 电磁波与辐射2 电磁波的能量
  2. netcore 学习
  3. 超图js版本加载点图层和点要素
  4. C++内联函数学习总结
  5. Access数据库操作软件研究
  6. Kubernetes的yaml文件中command的使用
  7. 15.3 Task Task.Yield和Task.Delay说明
  8. WIN10安装scrapy/channels等不成功的解决方式
  9. 弱类型语言的优势:C#的委托概念在Javascript中的实现
  10. java经典50题_JAVA经典算法50题(3)【面试+工作】