
托管和非托管内存
C#
singhwong
C#,UWP,.Net
展开
-
八、平台调用
并不是Windows API调用的所有特性都可用于.NET。旧的Windows API调用是这样,新功能也是这样。也许开发人员会编写一些DLL,导出非托管的方法,在C#中使用它们。要重用一个非托管库,其中不包含COM对象,只包含导出的功能,就可以使用平台调用(P/Invoke)。有了P/Invoke,CLR会加载DLL,其中包含应调用的函数,并编组参数。要使用非托管函数,首先必须确定导出的...原创 2020-04-29 18:26:07 · 259 阅读 · 0 评论 -
六、 引用的语义
第3章展示了在将参数传递给方法是所使用的ref关键字。当通过值传递结构时,将复制结构的内容。通过引用传递结构(使用ref关键字),新变量会引用相同的数据。...原创 2020-04-28 13:22:45 · 246 阅读 · 0 评论 -
五、不安全的代码
如前所述,C#非常擅长于对开发人员隐藏大部分基本内存管理,因为它使用了垃圾收集器和引用。但是,有时需要直接访问内存。例如,由于性能问题,要在外部(非.NET环境)的DLL中访问一个函数,该函数需要把一个指针当作参数来传递(许多Windows API函数就是这样)。本节将讨论C#直接访问内存的内容的功能。1.用指针直接访问内存下面把指针当作一个新论题来介绍,而实际上,指针并不是新东西。因...原创 2020-04-18 03:38:12 · 769 阅读 · 0 评论 -
四、处理非托管的资源
垃圾收集器的出现意味着,通常不需要担心不再需要的对象,只要让这些对象的所有引用都超出作用域,并允许垃圾收集器在需要时释放内存即可。但是,垃圾收集器不知道如何释放非托管的资源(例如,文件句柄、网络连接和数据库连接)。托管类在封装对非托管资源的直接或间接引用时,需要指定专门的规则,确保非托管的资源在收集类的一个实例时释放。...原创 2020-04-13 20:04:42 · 229 阅读 · 0 评论 -
三、强引用和弱引用
垃圾收集器不能收集仍在引用的对象的内存——这是一个强引用。它可以收集不能在根表中直接或间接引用的托管内存。然而,有时可能会忘记释放引用。注意:如果对象相互引用,但没有在根表中引用,例如,对象A引用B,B引用C,C引用A,则GC可能销毁所有这些对象。在应用程序代码内实例化一个类或结构时,只要有代码引用它,就会形成强引用。例如,如果有一个类MyClass,并创建了一个变量myClassVa...原创 2020-04-13 15:45:23 · 502 阅读 · 0 评论 -
二、后台内存管理
C#编程的一个优点是程序员不需要担心具体的内存管理,垃圾收集器会自动处理所有的内存清理工作。用户可以得到像C++语言那样的效率,而不需要考虑像在C++中那样内存管理工作的复杂性。虽然不必手动管理内存,但仍需要理解后台发生的事情。理解程序在后台如何管理内存有助于提高应用程序的速度和性能。本节要介绍变量分配内存时在计算机的内存中发生的情况。注意:本节不详细介绍许多主题的相关内容。应把这一节看作...原创 2020-04-13 15:45:41 · 666 阅读 · 0 评论 -
一、内存
变量存储在堆栈中。它引用的数据可以位于栈(结构)或堆(类)上。结构体也可以装箱,这样对象就会在堆上创建。垃圾收集器需要从托管堆中释放不再需要的非托管对象。使用本机API,可以在本机堆上分配内存。垃圾收集器不负责在本机堆上分配内存。必须自己释放这些内存。关于内存,有很多东西需要考虑。使用托管环境时,很容易被误导,注意不到内存管理,因为垃圾收集器(GC)会处理它。很多工作都由GC完成;了解它是如何...原创 2020-04-13 15:45:59 · 131 阅读 · 0 评论