当前位置: 首页 > news >正文

.net 受管制代码

其实整个.NET项目都是运行在.NET Framework上的托管代码,这个道理和JAVA虚拟机的机制是类似的。

最简单的说呢,受托管的代码不能直接写内存,是安全的,而非托管代码是非安全代码,可以使用指针操作内存。

一般的项目使用托管代码都行了,也就是说在程序里面不需要用到非安全代码。

对于一些对速度要求高的部分功能可以考虑使用非安全代码,使用指针等读写内存,而对于真个项目来说还是受托管的安全代码。

有关非安全代码的信息请查阅MSDN unsafe。

在string方法中,如ToUpper等字符串操作方法,都会产生一个新的字符串,这样增大了运行开支。一个替代方案是通过非托管代码直接操作字符串。如替代ToUpper方法:
  using System;
  public class Test
  {
  public static void Main(string[] args)
  {
   string str = 'hello';
   ToUpper(str);
   Console.WriteLine(str);
  }
  private static unsafe void ToUpper(string str)
  {
   fixed(char * pfixed = str)
   for(char * p=pfixed;*p!=0;p++)
   {
   *p = char.ToUpper(*p);
   }
  }
  }
  fixed语句:
  格式fixed ( type* ptr = expr ) statement
  它的目的是防止变量被垃圾回收器生定位。
  其中:
  type为非托管类型或void
  ptr为指针名
  expr为可以隐式转换为type*的表达式
  statement为可执行的语句或块
  fixed语句只能在unsafe的上下文中使用,fixed 语句设置指向托管变量的指针并在 statement 执行期间“锁定”该变量。如果没有 fixed 语句,则指向托管变量的指针将作用很小,因为垃圾回收可能不可预知地重定位变量。
  执行完 statement 后,任何锁定的变量都被取消锁定并受垃圾回收的制约。因此,不要指向 fixed 语句之外的那些变量。在不安全模式中,可以在堆栈上分配内存。堆栈不受垃圾回收的制约,因此不需要被锁定。
  但在编译时,因为使用了非托管代码,必须要使用/unsafe才能通过。

简单来说,托管的代码就是把有关内存管理(内存申请,内存释放,垃圾回收之类的)全部都是.net的CLR来管理,就是说使用托管的代码把底层的一些操作都封装起来了,不能直接进行内存的读取之类的和硬件相关的操作,优点就是比较安全,不会出现诸如内存泄露之类的问题,缺点也很明显,不能直接读取内存,性能上会有损失,使用起来有时也不够灵活。 
非托管的刚好相反,可以直接进行硬件操作,性能比较高,但是对开发人员的要求也比较高。 
最直观的就是c#不推荐使用指针,而c++就可以使用指针来直接读取内存; 
c#使用垃圾回收,c++要手动的释放对象……

转载于:https://www.cnblogs.com/ulex/archive/2010/11/01/1865994.html

相关文章:

  • vue的计算属性选项
  • 24、Windows派遣函数(2)-Windows驱动开发详解笔记,直接读写方式
  • Unity类继承关系 图
  • 通俗易懂的dagger2-入门篇
  • Scom 2007客户端监控
  • 【新手向】TensorFlow 安装教程:RK3399上运行谷歌人工智能
  • 域功能级别与目录林功能级别
  • 关于SVM(support vector machine)----支持向量机的一个故事
  • 静态文件的缓存
  • 广联达面试
  • JavaScript案例开发之扑克游戏
  • 信息系统开发平台OpenExpressApp:【OpenTest】 之 框架实现说明
  • 优秀者是真的优秀
  • PKU 1011
  • 阿里巴巴加强个人信息保护 获中央网信办等四部委点赞
  • Angular 4.x 动态创建组件
  • echarts的各种常用效果展示
  • es的写入过程
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • magento2项目上线注意事项
  • Python语法速览与机器学习开发环境搭建
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 工作手记之html2canvas使用概述
  • 使用 Docker 部署 Spring Boot项目
  • 小而合理的前端理论:rscss和rsjs
  • 用jQuery怎么做到前后端分离
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​香农与信息论三大定律
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #define、const、typedef的差别
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $GOPATH/go.mod exists but should not goland
  • (52)只出现一次的数字III
  • (rabbitmq的高级特性)消息可靠性
  • (zt)最盛行的警世狂言(爆笑)
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (轉貼) UML中文FAQ (OO) (UML)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • **PHP分步表单提交思路(分页表单提交)
  • .net core Swagger 过滤部分Api
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net反编译的九款神器
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET性能优化(文摘)
  • @Autowired注解的实现原理