为什么显式接口实现?
我最近实现了一个类:
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’的定义”)。 一些谷歌搜索引导我到这个线程 ,在那里我学习了正在发生的事情,所以我现在了解它的机制。 MSDN文档表明作者更喜欢我调用Close()而不是Dispose(),但不解释原因。
这种模式的目的是什么(我认为我在IO类中也看到了它)? 鉴于这是class级作者的故意决定,上面的代码有多糟糕(通过IDisposable接口调用Dispose)? 这不可能太糟糕 – 毕竟,这是在使用声明中会发生什么,对吧?
[编辑:1]将标题从“非公开”更改为“显式”2)从我的代码中删除了显式实现,意外地从实验中留下了]
这称为显式接口实现 。 在您的示例中,因为您将Dispose()方法定义为“void IDisposable.Dispose()”,所以您也明确地实现了IDisposable接口。
通常这样做是为了避免碰撞。 如果Microsoft想要添加另一个对RegistryKey执行其他操作的Dispose()方法,除非他们使用该接口的显式实现,否则它们将无法执行。
这通常使用通用的IEnumerable
public clas SomeClass : IEnumerable { public IEnumerator GetEnumerator () { ... } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } }
这种方式当你调用SomeClass的GetEnumator方法的对象时,它调用generics版本,因为另一个是明确实现的,允许我们获得强类型generics允许。
请参阅Jesse Liberty 编程C#的第166-169页(我已经获得了第四版)。
大多数人不同意我的意见,但我喜欢对所有接口使用显式接口实现 。 我想说清楚我是在写一个方法来调用我的对象还是我的界面。
如果你有一个对象的引用并想调用一个接口方法(如上面的例子),这很痛苦,但我通过编写来缓解它:
class C : IDisposable { public IDisposable IDisposable { get { return this; } } void IDisposable.Dispose() { } }
这意味着在C上调用方法看起来像:
C c = ... c.IDisposable.Dispose();
编译器将其解析为“在C上调用IDisposable
属性,然后在结果上调用Dispose()
方法”但我将其读作“在C
上调用IDisposable.Dispose()
方法”,这在这里看起来很自然。
遗憾的是,这种方法在使用通用接口时会变得很难看。
上述就是C#学习教程:为什么显式接口实现?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/955280.html