才学C#,搞不明白托管代码到底是什么,还有什么托管堆啥的
根据我的理解,托管代码是不是运行在C#给它提供的一个虚拟环境中?
那如果我调用了dll中一某个API,使用了不安全代码,这些又算那种情况呢?
C++不是托管的,那在堆上的数据,代码是不是没人管了,必须手动释放(没学过C++)
这些问题很是疑惑,搞不明白
望高手指点

解决方案 »

  1.   

    .net在程序语言和操作系统之间的增加了一个中间层-虚拟机,C#编写的程序由虚拟机管理,一般不能直接操作操作系统,即由虚拟机托管。以前的程序语言,如C++,是直接面向操作系统的。
      

  2.   

    托管:由.net虚拟机管理
    非托管:由操作系统直接管理。
      

  3.   

    看看这个帖子:http://topic.csdn.net/u/20091029/08/20b3b82a-83ec-4d4f-997c-cf693f691a0d.html
      

  4.   


    同等条件下,运行效率不如C++。还有一个效率不高的原因是.net编译后是字节码,并不是可以在cpu上运行的机器码。
    程序运行的时候.net runtime(虚拟机)会先把字节码编译成机器码,再运行。幸运的是.net runtime使用JIT编译技术,也就是运行一遍后机器码会cache,再次运行不需要再重新编译了,因此.net更适合web上使用,桌面程序第一次启动有点慢。
      

  5.   

    LZ 看看CLR Via C#,把其中的每个知识点弄熟弄通,我相信你可以成为坛子里的高手!
      

  6.   

    不可以这么说的,C#底层很多实现是C/C++没错,而且很多P/Invoke Windows函数,
    但是你别忘了这个虚拟机在设计的时候已经考虑了如何优化代码,优化性能,优化内存管理和释放以及线程管理还有配合C#编译器,JIT编译器能将代码优化到最佳,比如GC,线程池,泛型等等...
      

  7.   

    托管代码由CLR管理(.net平台下的代码)
    非托管代码指的是本地代码(native code),直接编译成汇编语言的。。
      

  8.   

    大概懂了一些
    那么调用dll里的函数就不用虚拟机管理了吧?
    如果我把需要快速运算的部分用C写,然后调用,这样整个程序应该会快些吧?
      

  9.   

    是的,不过dll不一定是非托管的,只有c++/MFC生成的dll才是非托管的,c#也可以生成dll文件,但c#写的dll都是托管的,运行在虚拟机上,托管代码调用非托管的dll函数的时候,会进行参数返回值的类型转换,也就是所谓的“封送数据”,这个转换也会消耗cpu,所以用C写函数在c#中调用,不一定能提高速度,而且很麻烦,多数情况下没有必要这么做,
      

  10.   

    托管实说不用你管理对象的生存期问题,不用你去管理对象的内存分配,不用你去操心内存泄漏问题,你只管 new,不用 delete