Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 垃圾收集概念_C#_Garbage Collection_Dispose_Finalize - Fatal编程技术网

C# 垃圾收集概念

C# 垃圾收集概念,c#,garbage-collection,dispose,finalize,C#,Garbage Collection,Dispose,Finalize,Finalize()-此函数仅在垃圾收集过程中清理非托管资源-用户不知道何时实际执行此方法。此外,用户无法直接调用此函数清理内存 Dispose()-通过实现IDisposable接口,用户可以清理非托管资源,用户将准确地知道何时释放资源 我的理解是Finalize()不能被重写以清理非托管资源。这是一个系统进程,仅用于“GC”进程将用于清理非托管资源。 若用户需要自己清理资源,那个么他/她应该实现IDisposable接口并显式调用Dispose()。没有其他可能清理非托管资源的最佳实践是使用

Finalize()-
此函数仅在垃圾收集过程中清理非托管资源-
用户不知道何时实际执行此方法。
此外,用户无法直接调用此函数清理内存

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开始。