C#unsafe
来源:互联网 发布:债券数据怎么看 编辑:程序博客网 时间:2024/06/05 11:05
托管代码 (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); }}
注意要勾选项目属性中生成标签的允许不安全代码。
0 0
- C#unsafe
- c sharp: unsafe and fixed
- Unsafe
- Unsafe
- Unsafe
- C#中使用指针转换数据类型[C#/unsafe]
- (转)C#中使用指针转换数据类型[C#/unsafe]
- J.U.C里常用到了Unsafe类资源汇总
- unsafe关键字
- unsafe & fixed
- UnSafe & Fixed
- unsafe指针
- Unsafe初涉
- Unsafe类
- Java --- Unsafe
- unsafe关键字
- Unsafe类
- unsafe编译
- Oracle生成随机日期时间
- 恢复oracle
- 关于json
- word 2010+ 从指定页开始设置页码
- 彻底理解ThreadLocal
- C#unsafe
- Java再学习—TCP/UDP通信原理
- 【使用JMeter 对Web服务器压力测试】
- 《塔防类手游开发教程》 第二节 TiledMap中对象层数据读取
- 每个程序员都应该知道的福利
- JeepIp
- libevent框架初步学习
- 《塔防类手游开发教程》 第三节 通过动作序列Sequence实现怪物移动
- 阿里面试杂谈