0

我看到很多这样的代码:

public class MyWcfService : IMySerciceContract, IDisposable
{
    private DatabaseOperations _dataAccess;

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

    protected virtual void Dispose(bool disposing)
    {
        _dataAccess.Dispose();
    }
}

MyWcfService 类将托管在 IIS 或 WAS 中,没有人会在其中显式调用 Dispose。我的想法是让这个类实现 IDisposable 是没有意义的,你最好将 _dataAccess 的使用包装在 using 语句中。据我了解,实现 IDisposable 的类的期望是该类的用户将在 using 块声明中实例化它。考虑到没有用户会显式调用 Dispose,上述示例是否是不好的做法?如果我们像上面的例子一样依赖 GC 来清理,GC 是调用 Dispose,还是只是调用 finalizer?

4

2 回答 2

1

... ,没有人会显式调用 Dispose 。我的想法是让这个类实现 IDisposable 毫无意义......

关键是,缺少Dispose在您的代码中调用的终结器..

...据我了解,实现 IDisposable 的类的期望是该类的用户将在 using 块声明中实例化它...

通常,实现的类的期望IDisposable有一些东西要处理using只是一个语法糖,它根本不是实现的原因IDisposable

...如果我们像上面的例子一样依靠 GC 来清理,GC 甚至会调用 Dispose,还是只是调用终结器?

GC 不会Dispose自动调用,因此您需要让终结器调用它。

public partial class MyWcfService: IMySerciceContract, IDisposable {
    private DatabaseOperations _dataAccess;

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

    protected virtual void Dispose(bool disposing) {
        if(!this.disposed) {
            if(disposing) {
                _dataAccess.Dispose();
            }

            this.disposed=true;
        }
    }

    // so it make sense now .. 
    ~MyWcfService() {
        this.Dispose(false);
    }

    bool disposed;
}

如果Dispose没有被消费者调用,终结器会在必要时调用它。查看如何实现 [ IDisposable 接口]。

于 2013-10-24T02:19:52.053 回答
1

“DatabaseOperations _dataAccess”是一个类成员,由你的类“拥有”。它是 IDisposable,所以你的班级也应该是。并且您应该始终实施完整的标准处置模式以保持一致性。

如果 _dataAccess 是类方法中的局部变量,您在方法范围内使用并丢弃了它,那么 using 块将是合适的。

通常,您希望以这样一种方式进行编码,以便为您的代码的用户提供最大程度的清理控制。这意味着如果您的任何成员都是 IDisposable。但是对于非成员 IDisposable 对象,“使用”是要走的路。

当然,这同样适用于您班级的消费者。如果他们将您的类作为成员字段嵌入,他们应该使他们的类 IDisposable。否则,他们可以对您的类对象使用“使用”……等等。

于 2013-10-24T02:22:02.983 回答