我最近实施了一个类:
class TestClass : IDisposable { RegistryKey m_key; public TestClass() { m_key = Registry.CurrentUser.OpenSubKey("Software",false); } public void Dispose() { // m_key.Dispose(); IDisposable disp = m_key; disp.Dispose(); } }
如果我取消了对Dispose的直接调用,我得到错误CS0117(“’Microsoft.Win32.RegistryKey’不包含’Dispose’的定义).一些Google搜索引导我到了this thread,在那里我学到了什么,所以我现在明白了它的机制. MSDN文档表明,作者更喜欢我调用Close()而不是Dispose(),但不能解释为什么.
这个模式的目的是什么(我认为我在IO类中看到过)?鉴于这是类作者的故意决定,上面的代码有多糟糕(通过IDisposable界面调用Dispose)?这不可能太糟糕 – 毕竟,使用声明会发生什么,对吧?
解决方法
这被称为显式接口实现.在您的示例中,由于将Dispose()方法定义为“void IDisposable.Dispose()”,因此您还将显式实现IDisposable接口.
这通常是为了避免碰撞而进行的.如果Microsoft曾经想要添加另一个Dispose()方法,该方法对RegistryKey执行了其他操作,除非他们使用该接口的显式实现,否则它们将无法进行.
这通常用通用IEnumerable< T>接口.它需要您也实现非通用接口IEnumerable.这两个接口中唯一的成员是GetEnumerator,通用的一个更有用,所以它通常实现如下:
public clas SomeClass : IEnumerable<SomeOtherClass> { public IEnumerator<SomeOtherClass> GetEnumerator () { ... } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } }
这样当您调用SomeClass的GetEnumator方法的对象时,它将调用通用版本,因为另一个被明确实现,从而允许我们获得强类型的泛型允许.
参见Jesse Liberty编程C#的第166-169页(我有第四版).