关于资源释放,最后一点需要提的是Close函数。在语义上它和Dispose很类似,按照MSDN的说法,提供这个函数是为了让用户感觉舒服一点,因为对于某些对象,例如文件,用户更加习惯调用Close()。
然而,毕竟这两个函数做的是同一件事情,因此MSDN建议的代码就是:
- public void Close()
- {
- Dispose(();
- }
这里直接调用不带参数的Dispose函数以获得和Dispose相同的语义。这样似乎就圆满了,但是从另外一方面说,如果同时提供了Dispose和Close,会给用户带来一些困惑。没有看到代码细节的前提下,很难知道这两个函数到底有什么区别。因此在.NET的代码设计规范中说,这两个函数实际上只能让用户用一个。因此建议的模式是:
- public class BaseResource: IDisposable
- {
- public void Close()
- {
- Dispose();
- }
- void IDisposable.Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
- protected virtual void Dispose(bool disposing)
- {
- // 同前
- }
- }
这里使用了一个所谓的接口显式实现:void IDisposable.Dispose()。这个显式实现只能通过接口来访问,但是不能通过实现类来访问。因此:
- BaseResource baseRes= new BaseResource ();
- baseRes.Dispose(); // 错误
- (baseRes as IDisposable).Dispose(); // 正确
这样做到了兼顾两者。对于喜欢使用Close的人,可以直接用 baseRes.Close(),并且他看不到 Dispose()。对于喜欢Dispose的,他可以把类型转换为 IDisposable 来调用,或者使用using语句。两者皆大欢喜!