C# 为什么要处置一件肯定很快就会被处置的物品?
假设我有一个程序,例如点击按钮 我创建了一个图形对象 显然我应该把它处理掉C# 为什么要处置一件肯定很快就会被处置的物品?,c#,.net,winforms,memory,idisposable,C#,.net,Winforms,Memory,Idisposable,假设我有一个程序,例如点击按钮 我创建了一个图形对象 显然我应该把它处理掉 using(Graphics gr__=this.CreateGraphics()) { } 或者在try-catch-finally的finally中调用.Dispose() 但是考虑到这个过程很快就会结束 假设我在过程的本地创建它(不是全局的,不是在使用中)。但这是当地的程序 当然,就像其他变量一样,它会在过程完成时自动处理,不是吗 那么,为什么手动/显式地处理它对我来说很重要呢 为什么我不能让它像其他变量一
using(Graphics gr__=this.CreateGraphics()) {
}
或者在try-catch-finally的finally
中调用.Dispose()
但是考虑到这个过程很快就会结束
假设我在过程的本地创建它(不是全局的,不是在使用中)。但这是当地的程序
当然,就像其他变量一样,它会在过程完成时自动处理,不是吗
那么,为什么手动/显式地处理它对我来说很重要呢
为什么我不能让它像其他变量一样自动进行垃圾收集
当然,它可能比“int”大一点,但它可能仍然很小,并且不会在内存中保留很长时间,因为过程结束得很快。甚至可能是在使用完成或调用
Dispose()
后,过程结束,因此我认为如果变量是过程的局部变量,它将被释放。那么,为什么要使用?对Dispose()
/进行显式垃圾收集呢
处置
垃圾收集
这两个概念之间有很大的区别
虽然Graphics
在被GC收集时会被丢弃,但为什么要等待GC运行并增加应用程序的内存
这是图形
析构函数的代码
~Graphics()
{
try
{
this.Dispose(false);
}
finally
{
// ISSUE: explicit finalizer call
// ISSUE: explicit non-virtual call
__nonvirtual (((object) this).Finalize());
}
}
阅读更多
当然,就像其他变量一样,它会在过程完成时自动处理,不是吗
不幸的是,并非所有System.Drawing类都是如此(编辑:read dotctor answer)
还有一些其他棘手的类,如位图,虽然它是“管理的”,但大小很小。所以,每当它被延迟处理时,就会导致内存不足
在内存泄漏发生之前对未使用的对象进行二次存储是一种更好的做法
但细节更为复杂
您可以在System.Drawing中搜索更多有关非托管资源的信息,以了解更多信息。GDI+基于C++并生成对非托管对象的引用。因此,处理System.Drawing命名空间的一次性对象非常重要,因为垃圾收集器不会自动处理非管理对象。这些对象可能包含完成作业的终结器;但是,您无法控制这些终结器的执行时间。另外,挂起的终结器也会使堆变得混乱。因此,最好显式调用Dispose()
,或者通过使用-语句调用。通常,您无法知道对象何时将被垃圾收集,从而被处置
在处理之前,某些对象将保留对资源的引用,这些资源将使用您的内存或禁止某些操作。因此,一旦这些物品不再有用,就立即处理它们是很好的
我正在处理一个bug,其中一个临时SQLite数据库文件在使用后无法删除,但只是偶尔删除!经过三天令人沮丧的研究,我发现问题是SQLite命令对象没有及时处理
因此,请使用您的和s;-) 当一个过程完成并且GC包含它的变量时,GC不会运行吗?我认为局部变量的一个优点是它们只存在于程序的生命周期中,因此使用的内存更少。不,它不会。变量是,但分配给对象的内存存在于内存中。引用对象的变量与内存中的对象本身之间存在差异。那么int a
在过程完成后内存是否也不清除?我们为什么不手动释放它呢?int
不是一个参考变量。它是一种值类型。类型为int
的局部变量在离开作用域(方法已完成)后所使用的内存将被清除。那么,当过程完成时,int上的垃圾回收是否已完成?否,它不会导致内存泄漏。Graphics
的Dispose方法在最终确定时将被调用。编辑后,我将其引用到您的回答中看起来“int”不是垃圾收集的,但在其声明的过程完成后,其他一些内存管理会对其进行处理。垃圾收集有时会运行,但可能不会在过程完成时运行。。我认为它适用于C中有指针或引用的情况,使用malloc时。。你可以释放它,这是垃圾收集,但你不会为了一个'int;。IDisposable对象可能是某种不同类型的东西,需要某种不同形式的垃圾收集。你能在代码中证明垃圾收集器没有处理它吗?你必须使用内存分析工具,比较有显式处理的版本和没有显式处理的版本。