博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中的Unsafe和Fixed
阅读量:5137 次
发布时间:2019-06-13

本文共 1213 字,大约阅读时间需要 4 分钟。

托管代码 (managed code):由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动 垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。非托管代码(Unmanaged Code):在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支 持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
Unsafe的代码介于这两者之间,它也是在CLR的环境中执行,但是我们可以直接操作内存。只要我们的代码包含下面三个指针操作符之一就需要使用Unsafe 关键字:
  • *
  • &
  • ->

例如:

unsafe static void ChangeValue(int* pInt)    {        *pInt = 23;    }

上面的代码由于是在CLR下托管执行,为了减少内存碎片C#的自动垃圾回收机制会允许已经分配的内存在运行时进行位置调整,所以如果我们多次调用的话就可能

导致指针指向其他的变量。比如*pInt为指向一个变量的地址为1001,CLR在重新内存整理分配后该变量就存储在地址为5001的地方。而原来1001的地方可能会
被分配其他变量,要解决这个问题我们就需要使用Fixed关键字。

fixed 语句禁止垃圾回收器重定位可移动的变量。fixed 语句只能出现在不安全的上下文中。Fixed 还可用于创建固定大小的缓冲区。如下面例子:

using System;class CaryData{    public int data;}class CProgram{       unsafe static void ChangeValue(int* pInt)    {        *pInt = 23;    }    public unsafe static void Main()    {        CaryData cd = new CaryData();        Console.WriteLine("改变前: {0}", cd.data);                fixed (int* p = &cd.data)        {            ChangeValue(p);        }        Console.WriteLine("改变后: {0}", cd.data);    }}

注意要勾选项目属性中生成标签的允许不安全代码。

 
http://www.cnblogs.com/carysun/archive/2009/11/07/csharp-unsafe.html
    

转载于:https://www.cnblogs.com/jiahuafu/p/7047649.html

你可能感兴趣的文章
网络编程01 - 客户端和服务端循环发送消息
查看>>
unicode转码方法
查看>>
软件工程结对编程第二次作业
查看>>
[转] VS2010中VC9.0Runtime与VC10.0Runtime在win7上装不上提示error code 1603
查看>>
关于TP框架
查看>>
SpringBoot使用logback日志记录
查看>>
dede标签:arclist标签使用大全
查看>>
登录之后返回上一页
查看>>
字符串与文件的匹配
查看>>
关于软件IntelliJ IDEA的使用技巧(三)
查看>>
php中屏蔽date的错误
查看>>
iOS自动布局框架-Masonry详解
查看>>
IOS 开发-- 常用-- 核心代码
查看>>
JavaScript 学习心得 基础
查看>>
一些不太常见但很有用的java类
查看>>
web 前端安全
查看>>
027:高级复制
查看>>
css3
查看>>
windows2008 https TLS使用1.2
查看>>
移动端开发——关于局部区域滚动总结---实战系列
查看>>