C# 垃圾收集概念
Finalize()-C# 垃圾收集概念,c#,garbage-collection,dispose,finalize,C#,Garbage Collection,Dispose,Finalize,Finalize()-此函数仅在垃圾收集过程中清理非托管资源-用户不知道何时实际执行此方法。此外,用户无法直接调用此函数清理内存 Dispose()-通过实现IDisposable接口,用户可以清理非托管资源,用户将准确地知道何时释放资源 我的理解是Finalize()不能被重写以清理非托管资源。这是一个系统进程,仅用于“GC”进程将用于清理非托管资源。 若用户需要自己清理资源,那个么他/她应该实现IDisposable接口并显式调用Dispose()。没有其他可能清理非托管资源的最佳实践是使用
此函数仅在垃圾收集过程中清理非托管资源-
用户不知道何时实际执行此方法。
此外,用户无法直接调用此函数清理内存 Dispose()-
通过实现IDisposable接口,用户可以清理非托管资源,用户将准确地知道何时释放资源 我的理解是Finalize()不能被重写以清理非托管资源。
这是一个系统进程,仅用于“GC”进程将用于清理非托管资源。
若用户需要自己清理资源,那个么他/她应该实现IDisposable接口并显式调用Dispose()。没有其他可能
清理非托管资源的最佳实践是使用“using”语句 问题1: 我的理解正确吗?如果我错了,请纠正我的上述陈述 问题2:
另外,我想知道,我可以通过实现IDisposable接口和调用Dispose()来清理托管资源吗?Finalize不会清理内存。它处理非托管资源。在.NET应用程序中,内存是一种托管资源,内存的分配和释放由运行时处理。你不必做任何特别的事。当对象符合收集条件时,垃圾收集器将回收内存
这就引出了第二个问题的答案:不,您不能使用
IDisposable
清理内存,因为内存是通过垃圾收集自动回收的。使用IDisposable
处理GC未处理的资源,例如句柄 最后,这两种方法都会释放非托管资源。区别Finalize()&Dispose()Dispose()用法的一点是,Dispose()是释放非托管资源的唯一方法,并且应该在终止对象时显式调用它。Finalize()由CLR调用,虽然它将调用Dispose(),但依赖Finalize()(因此您自己不调用Dispose())意味着您完全无法控制何时释放非托管资源。这可能意味着不必要地打开数据库连接等。因此:当您有非托管资源时,请实现IDisposable和Finalize(),并确保调用方调用Dispose().Hmm,Object.Finalize()始终被覆盖。实际上,这样做99.99%的时间是完全错误的。一个似乎无法摆脱的.NET1.x细节。可终结的资源应该有自己的包装器类,从SafeHandle和friends开始。