在析构函数中处置对象

Rob*_*vey 5 c# dispose idisposable

我有一个具有一次性物体作为成员的物体.

public class MyClass
{
    private MyDisposableMember member;

    public DoSomething
    {
         using (member = new MyDisposableMember())
         {
             // Blah...
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以有很多方法MyClass,都需要using声明.但是,如果我这样做呢?

public class MyClass
{
    private MyDisposableMember member = new MyDisposableMember();

    public DoSomething
    {
         // Do things with member :)
    }

    ~MyClass()
    {
        member.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,member正在处理析构函数.这会有用吗?这种方法有什么问题吗?

Ree*_*sey 11

理想情况下,Dispose()应该在完成之前调用.遵循典型的dispose模式会更好,并允许用户正确地Dispose()对象,并且如果尚未调用 dispose,则让终结器处理它.

在这种情况下,由于您正在封装IDisposable,因此您根本不需要实现终结器.(在最终确定时,您的封装成员将最终确定,因此无需最终确定您的对象 - 它只会增加开销.)有关详细信息,请阅读我撰写的关于封装IDisposable的博客文章.

  • http://blogs.msdn.com/ericlippert/archive/2010/01/21/what-s-the-difference-between-a-destructor-and-a-finalizer.aspx应将其称为终结器. (2认同)

rec*_*ive 7

你应该制作MyClass工具IDisposable.在Dispose()方法内部,调用member.Dispose();.这样程序员就可以控制成员何时被处置.