为什么要处理一个肯定很快就会被处理掉的东西?假设我有一个程序可以点击一个按钮。我创建了一个图形对象。显然我应该处理它,例如using(Graphicsgr__=this.CreateGraphics()){}或最后在try-catch-finally中调用.Dispose()。但要考虑到该计划将很快结束。假设我在程序本地创建它(不是全局的,未使用)。但是本地程序。然后肯定像任何其他变量一样,它会在程序结束后自动处理,不是吗?那么为什么我手动/显式处理它很重要?为什么我不能像任何其他变量一样自动进行垃圾收集?当然它可能比'int'大一点,但它仍然可能很小并且不会被记住很长时间,因为程序结束得太快了。它甚至可能是当您完成使用或调用Dispose()时,程序结束,所以我假设如果变量是程序的本地变量,它将被释放。那么为什么要使用Dispose()/using进行显式垃圾收集呢?Microsoft.NET类库通过System.Drawing命名空间为GDI+提供托管接口。GDI+基于C++并生成对非托管对象的引用。因此,配置System.Drawing命名空间的一次性对象非常重要,因为垃圾收集器不会自动处理非托管对象。这些对象可能包含有效的终结器;但是,您无法控制何时执行这些终结器。等待终结器也会弄乱堆。因此,最好显式或通过using语句调用Dispose()。然后肯定像任何其他变量一样,它会在程序结束后自动处理,不是吗?不幸的是,并非所有System.Drawing类都如此(编辑:阅读医生的回答)还有一些其他棘手的类,如Bitmap,虽然是“托管”的,但体积很小。所以每当处理晚了,它就会耗尽内存!在发生内存泄漏之前浸泡未使用的对象是更好的做法。但细节比较复杂。您可以在System.Drawing中搜索有关非托管资源的更多信息以了解更多信息。这里有两个不同的概念。DisposalGarbagecollection这两个概念有很多区别。虽然Graphics在GC收集的时候会被处理掉,但是为什么要等GC运行起来再增加应用的内存镜头呢?这是图形析构函数的代码。~Graphics(){尝试{this.Dispose(false);}finally{//问题:显式终结器调用//问题:显式非虚拟调用__nonvirtual(((object)this).Finalize());阅读基本原理了解更多垃圾收集GC、Finalize()和Dispose之间有什么关系?栈和堆的内容和位置是什么?通常,您无法知道对象何时会被垃圾收集并因此被处置。在处置之前,某些对象将持有对资源的引用,这些资源将使用您的内存或禁止某些操作。因此,它们可以在不再使用后立即处理掉。我正在处理一个错误,其中临时SQLite数据库文件在使用后无法删除,但有时只是!经过三天的折腾研究,我发现问题出在SQLite命令对象上,没有及时处理。所以使用你的使用?以上就是C#学习教程:为什么要处理一个肯定很快就会被dispose的对象?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
