c# - 为什么要处理一个肯定会很快被处理掉的对象呢?

标签 c# .net winforms memory idisposable

假设我有一个程序,例如单击按钮。

然后我创建了一个 Graphics 对象。

显然我应该处理掉它,例如

using(Graphics gr__=this.CreateGraphics())  {

} 

或在 try-catch-finally 的 finally 中调用 .Dispose()

但考虑到手术很快就会结束。

假设我在程序本地创建它(不是全局的,不是在使用中)。但是在程序的本地。

然后肯定像任何其他变量一样,它会在过程完成时自动处理,不是吗?

那么为什么手动/显式处理它对我来说很重要?

为什么我不能让它像任何其他变量一样自动进行垃圾收集?

当然,它可能比“int”大一点,但它可能仍然很小并且不会在内存中保存很长时间,因为无论如何该过程结束得如此之快。甚至可能是在使用完成或 Dispose() 被调用后,过程结束,因此我想它会被释放,如果变量是过程的本地变量。那么,为什么要为 Dispose()/using 的显式垃圾收集而烦恼呢?

最佳答案

The Microsoft .NET class library provides a managed interface for GDI+ via the System.Drawing namespace. GDI+ 基于 C++,并产生对非托管对象的引用。因此,处理 System.Drawing 命名空间的一次性对象很重要,因为垃圾收集器不会自动处理非托管对象。这些对象可能包含完成这项工作的终结器;但是,您无法控制何时执行这些终结器。挂起的终结器也使堆变得困惑。因此,最好显式调用 Dispose() 或通过 using 语句调用。

关于c# - 为什么要处理一个肯定会很快被处理掉的对象呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34373828/

相关文章:

c# - 什么是 C# Using block ,我为什么要使用它?

c# - 合并两个 Observable 时保留排序

c# - 在 .NET 中可视化树状数据结构的好方法是什么(如果可能,实时)?

c# - 使用 System.Drawing 改变形状

c# 我可以防止我的构造函数参数与 VBA 实例化冲突吗?

c# - 异步等待 : is the main thread suspended?

.net - .NET 中的视频处理

c# - 如何从 ASP.NET 中的表单访问字段数组?

winforms - 使用 VS 2015 Professional 创建无需管理员权限即可运行的设置

c# - 远程服务器 (403) 使用 WebClient 时出现禁止错误