1

如果这是一个愚蠢的问题,我很抱歉,但是在您明确处理一个对象之后,您不应该再次引用该对象......对吗?

示例:这通常是个坏主意,对吧?

SomeObject o = new SomeObject();

o.DoStuff();

o.Dispose();

o.DoMoreStuff();

另外,有没有必要做这样的事情?

4

4 回答 4

2

处理一个对象会告诉它释放所有非托管资源,因此您必须问自己的问题是“如果没有这些资源,该对象是否可以做任何有意义的事情”。这将取决于对象的具体情况。

大多数IDisposable对象的设计是这样的,如果您在处理完实例后尝试调用它们的方法,它们将抛出异常,或者更糟的是,只会出现意外行为。

即使在被处置之后,其他对象仍有可能做有意义的事情。例如,DataTable 实现 IDisposable,但有意义的数据往往存储在托管资源中,而不是非托管资源中。在其当前的实现中(可能会发生变化),它的Dispose方法没有做任何事情,所以在它被处理后使用它就可以了。(话虽如此,当您仍打算使用它时, 没有令人信服的理由将其丢弃。)

也可以想象一个对象在它被处理后重新创建它需要的任何资源(这将是一个坏主意,但仍然可能)。

说了这么多,专门设计一个即使在它已经被处置后也打算使用的对象被认为是不好的做法,而且 Disposable 对象的意图也是在你完成之前不要处置它用它。这里的重点是,即使你不应该这样做,而且它经常会在你的脸上爆炸,这将是因为这就是选择实现类的方式(符合惯例)而不是因为它是技术要求。

于 2012-06-20T16:11:59.637 回答
2

除非你需要它,否则你永远不会 Dispose 一个对象。处理一个对象意味着你不再需要它了。当您不再需要该对象时,您将丢弃它(如果它是一次性的)。因此,在对象被处理后,就没有必要访问它了。

于 2012-06-20T16:10:02.503 回答
0

我喜欢在实现 IDisposable 时使用这种模式...

private bool m_disposed;

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

public void Dispose(bool disposing)
{
    if (!m_disposed)
    {
        if (disposing)
            // Cleanup and close resources

        m_disposed = true;
    }
}

然后在课堂上的所有其他方法中,我将这样做......

public void DoMoreStuff()
{
    if (m_disposed)
        throw new ObjectDisposedException();

  // Your code here
}

public void DoStuff()
{
    if (m_disposed)
        throw new ObjectDisposedException();

    // Your code here
 }
于 2012-06-20T16:22:31.803 回答
0

尽管从理论上讲,绝对没有什么能阻止您创建一个允许您处理然后继续使用该对象的类,但我想不出有一种情况是可取的(除了检查对象是否有已处置,例如IsDisposed)。

通常使用的模式是简单地丢弃已丢弃的对象,并在必要时重新创建它们,实际上在许多情况下尝试访问已丢弃的对象将导致ObjectDisposedException被抛出。如果您正在创建一个实现的对象,IDisposable那么遵循此约定将是一个好主意。

为了帮助跟踪哪些对象已被处置和尚未被处置(以及确保您的对象已被处置,即使在抛出异常的情况下),请使用以下using语句:

using (SomeObject o = new SomeObject())
{
    o.DoStuff();
}
于 2012-06-20T16:14:55.870 回答