zoukankan      html  css  js  c++  java
  • .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++要手动的释放对象……

  • 相关阅读:
    PAT A1094 The Largest Generation (25 分)——树的bfs遍历
    PAT A1055 The World's Richest (25 分)——排序
    PAT A1052 Linked List Sorting (25 分)——链表,排序
    PAT A1076 Forwards on Weibo (30 分)——图的bfs
    辅导员
    辅导员面试
    C程序设计
    Excel VBA 基本概念
    Excel函数
    导入excel表的数据到数据库ssh
  • 原文地址:https://www.cnblogs.com/ulex/p/1865994.html
Copyright © 2011-2022 走看看