处理托管对象是否会提高.Net中的性能?

luq*_*uqi 2 .net garbage-collection

因此,在托管对象上实现Dispose(),通过从提示中获取提示来改善垃圾收集器的性能可能会绕过其整个过程.

我在一个没有得到高票的问题上看到了这个答案,但这是真的吗?如果是,那怎么样?

不,这是错的.我同意Aaronaught的观点.此外,Microsoft建议在2003年中期的Don Box网络广播中,每个.Net开发人员都应该处理他们自己的对象,无论是托管还是非托管,因为这会使代码性能提高20%.如果做得好,它可以显着改善性能.因此它是每个.net开发人员需要知道和使用的核心技能.

Jon*_*eet 6

您根本无法 Dispose管理内存,就像调用Dispose释放文件句柄等一样.唯一可以清理托管内存的是垃圾收集器.

可以让一个Dispose方法设置一个类null中的所有变量,希望这将允许垃圾收集器更早地收集所有以前引用的对象 - 但是很少有情况下它实际上有所帮助,通常你的无论如何,对象将有资格收集.它还会使您的代码难以遵循.

在大多数情况下,不必担心对象的生命周期的能力是C#的好处之一 - 为什么要通过使每个类实现来摆脱它IDisposable?你真的想自己管理"所有权"和一生吗?

我怀疑你误解了你在问题中引用的(当然有点不清楚)答案.我不相信它主张处理所有对象 - 我相信它主张明确处理已经实现的类型的实例IDisposable.这与纯粹管理的类型无关,而这些类型几乎从未实现过IDisposable.


Wil*_*ill 5

首先,通过调用 Dispose 方法,它绝不会暗示 GC 应该执行任何特殊操作。与其他方法一样,Dispose 是一种正常方法。

神奇之处在于 Dispose 的作用,即释放不再需要的资源。

IDisposable 对象的第一条规则是在使用完它们后调用 Dispose。是的,GC 最终可能会清除内存,但如果对象仍然链接到仍在使用的任何其他对象,它们将保留下来。Dispose 还会清理非托管资源,这一点至关重要,例如数据库连接、文件句柄、锁等。这些肯定需要尽快关闭。

简而言之,如果实例化了 IDisposable 对象,则完成后将其释放。

是的,调用 Dispose 是有成本的,但正如我之前所说,这意味着对象之间可以取消链接,从而允许 GC 在下次运行时释放它们。这也意味着可以立即释放非托管资源。又一场胜利。内存和资源泄漏可能会严重影响性能,如果泄漏太过极端,应用程序也会崩溃!

开发者可能一直在保护重要资源,所以请不要试图猜测他!

分析是你的朋友。如果重新创建这些对象的性能是一个问题,请缓存它们,但仍然准备好在完成后处理它们。