在C#中处理对象销毁的最佳方法是什么?

时间:2013-11-08 00:03:58

标签: c# garbage-collection idisposable

我有一个类库项目,它有一个在对象构造期间创建文件的类。完成对象后,必须删除该文件。我已经实现了IDisposable并在Dispose()中编写了删除代码。问题是,我仍然看到该文件。我记得在某个地方读过Dispose并不能保证被调用。什么是实现这一目标的最佳方式?

3 个答案:

答案 0 :(得分:5)

.NET中的最佳做法是使用using块。我希望你不能保证如果有人编写孤立的代码,你的代码将永远是GC的。然而

Using Statement

  

提供方便的语法,确保正确使用IDisposable对象。

     

通常,当您使用IDisposable对象时,您应该在using语句中声明并实例化它。 using语句以正确的方式调用对象上的Dispose方法,并且(如前所示使用它时)一旦调用Dispose,它也会导致对象本身超出范围。在using块中,该对象是只读的,不能修改或重新分配。

using(YourDisposable iCanDispose = new YourDisposable())
{

  // work with iCanDispose
}

确保在离开作用域后调用对象dispose方法。

答案 1 :(得分:2)

在这种情况下,using关键字是您的朋友。任何实现IDisposable的东西都可以使用它,它为您提供了一种更好的机制来确保您的对象被处置。

它的用法看起来像这样:

using (SomeIDisposableObject someThing = new SomeIDisposableObject())
{
   // Do some work here and don't sweat to much because once I fall out-of-scope
   // I will be disposed of.
}    

您也可以嵌套它们,如下所示:

using (SomeIDisposableObject someThing = new SomeIDisposableObject())
{
   // I am next up for being disposed of.
   using (SomeOtherIDisposableObject someOtherThing = new SomeOtherIDisposableObject())
   {
      // I will get disposed of first since I am nested.
   }
}

你也可以叠加它们:

using (SomeIDisposableObject someThing = new SomeIDisposableObject())
{
   // I will be disposed of.
}

using (SomeOtherIDisposableObject someOtherThing = new SomeOtherIDisposableObject())
{
   // I will also be disposed of.
}

答案 2 :(得分:2)

你可以在finally块内的任何对象(实现IDisposable接口)上调用Dispose()函数来保证对象的破坏。

using block可用于简化上述解决方案,而无需创建try和finally块。所以任何需要使用using()块的对象都应该实现IDisposable接口,以便在使用块时,对象将立即被Disposed。

使用语法:

using(object declaration and initialization)
{
//statements
}

使用块类似于以下内容:

try
{
//object declaration and initialization
}
finally
{
//Call Object's Dispose() 
}