在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
托管代码 (managed code):由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动 Unsafe的代码介于这两者之间,它也是在CLR的环境中执行,但是我们可以直接操作内存。只要我们的代码包含下面三个指针操作符之一就需要使用Unsafe
unsafe static void ChangeValue(int* pInt) { *pInt = 23; } 上面的代码由于是在CLR下托管执行,为了减少内存碎片C#的自动垃圾回收机制会允许已经分配的内存在运行时进行位置调整,所以如果我们多次调用的话就可能 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
托管代码 (managed code):由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动 Unsafe的代码介于这两者之间,它也是在CLR的环境中执行,但是我们可以直接操作内存。只要我们的代码包含下面三个指针操作符之一就需要使用Unsafe
unsafe static void ChangeValue(int* pInt) { *pInt = 23; } 上面的代码由于是在CLR下托管执行,为了减少内存碎片C#的自动垃圾回收机制会允许已经分配的内存在运行时进行位置调整,所以如果我们多次调用的话就可能 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); } } 注意要勾选项目属性中生成标签的允许不安全代码。 |
请发表评论