c# object.Dispose() or object = null
本文关键字:object null or Dispose | 更新日期: 2023-09-27 18:28:09
嗨,我有一个对象是一次性的,我想知道什么更好:
this.object.Dispose();
或
this.object = null;
或
this.object.Dispose();
this.object = null;
Dispose
更好,更好的方法是在using
块中使用对象,并让框架处理它。
对于:this.object.Dispose();
与this.object = null;
将对象设置为null
可能导致遗漏未被处置的未被管理的资源。拥有IDisposable
的整个目的是确保未管理的资源在使用后被处理。
请参阅:IDisposable-MSDN
此接口的主要用途是释放非托管资源。垃圾收集器自动释放分配给当不再使用托管对象时。然而,事实并非如此可以预测垃圾回收何时发生。此外垃圾收集器不知道诸如窗口句柄或打开的文件和流。
您只需要Dispose
对象,不需要将其设置为null
,除非有其他代码检查空值并做出适当响应。
Dispose并不比设置为null更好或更糟。它们有不同的用途。
- 将其设置为null以释放对该对象的引用,以便垃圾收集器可以收集它。请记住,如果有其他对象对它的其他引用,这可能不会产生任何影响。作用域在这里起着重要作用(记住闭包、静态对象引用、事件委托等)
- 如果开发人员在对象上实现了IDisposable,则调用Dispose()。我认为IDisposable接口是一个"开发人员契约",它允许我们看到"嘿,这个对象在自己之后进行清理,但也提供了一个公共方法来显式地清理它!"
因为,如果实现正确,对象的终结器应该调用Dispose()方法,大多数情况下不需要显式调用它。一旦没有对对象的引用,终结器方法就会被垃圾收集器调用,从而被Dispose方法调用。
object.Dispose()或object=null
什么是处置?任何实现IDisposable的类型通常都有这个方法(尽管您可以编写自己的公共方法)。
public class Test:IDisposable
{
public void Dispose()
{
//release resources here managed and unmanaged
}
}
现在,由于您已经实现了IDisposable,因此最好的方法是
using (Test t = new Test())
{
}
通过在使用块框架中这样做,可以处理所有的资源。你不需要担心。即使对象上的终结器方法应该为调用Dispose()
尽管你也可以做
Test t = new Test();
t.Dispose();
现在把它设置为null怎么样?
Test t = new Test();
t = null;
它引用的对象不再可访问,现在可以进行垃圾回收(托管资源)。您必须自己处理未管理的资源。