为什么显式接口实现?

bmm*_*m6o 9 c# interface

我最近实现了一个类:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我取消注释直接调用Dispose,我会收到错误CS0117("'Microsoft.Win32.RegistryKey'不包含'Dispose'的定义").一些谷歌搜索引导我到这个线程,在那里我了解了发生了什么,所以我现在了解它的机制.在MSDN文档表明,笔者更希望我调用close()代替Dispose()方法,但没有解释原因.

这种模式的目的是什么(我认为我在IO类中也看到了它)?鉴于这是班级作者的故意决定,上面的代码有多糟糕(通过IDisposable接口调用Dispose)?它不会太糟糕 - 毕竟,这是在使用声明中会发生什么,对吧?

[编辑:1]将标题从"非公开"更改为"显式"2)从我的代码中删除了显式实现,意外地从实验中留下了]

Mar*_*osi 15

这称为显式接口实现.在您的示例中,因为您将Dispose()方法定义为"void IDisposable.Dispose()",所以您也明确地实现了IDisposable接口.

通常这样做是为了避免碰撞.如果Microsoft想要添加另一个为RegistryKey做其他事情的Dispose()方法,除非他们使用该接口的显式实现,否则他们将无法做到.

这通常使用通用的IEnumerable <T>接口来完成.它还要求您还实现非通用接口IEnumerable.这两个接口中唯一的成员是GetEnumerator,通用的一个更有用,所以它通常像这样实现:

public clas SomeClass : IEnumerable<SomeOtherClass>
{
    public IEnumerator<SomeOtherClass> GetEnumerator ()
    {
        ...
    }

    IEnumerator IEnumerable.GetEnumerator ()
    {
        return GetEnumerator ();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样当你调用SomeClass的GetEnumator方法的对象时,它会调用泛型版本,因为另一个是明确实现的,这使得我们可以获得强类型泛型.

参见Jesse Liberty 编程C#的第166-169页(我已经获得了第四版).