为什么许多基类库类都有显式接口实现成员?

时间:2012-07-10 20:54:56

标签: c# .net

MSDN:System.Type

与上面的链接一样,C#中的许多BCL类都将显式接口实现作为类成员。

据我所知,当基接口成员之间存在名称冲突时,我们必须使用显式接口实现。但为什么我们必须在上述情况下使用显式接口实现?它与哪个接口名称冲突?

1 个答案:

答案 0 :(得分:2)

接口的显式实现用于隐藏实例属性/方法,除非调用代码明确要求接口。

这在以下场景中很有用:

  • 类作者认为接口的实现仅在极少数情况下使用,并且出于可用性原因应默认隐藏( Type 类的情况显然如此)显式接口实现是特定于COM的)
  • 一个类实现两个或多个具有公共方法/属性签名的接口,但是根据接口提供不同的实现是必要的,因为接口具有除方法签名之外的隐式但不同的行为契约( Type class也有一个这样的例子;可能是_MemberInfo.GetIDsOfNames和_Type.GetIDsOfNames的实现共享相同的签名,但根据你是否将 Type 实例转换为_MemberInfo接口而做不同的事情。一个_Type接口)。
  • 已经使用(虽然不鼓励)使用类实现IDisposable,以便可以在使用块中使用它的实例,但鼓励调用者使用更多特定于域的方法直接调用方法时“处理”类。请参阅http://blogs.msdn.com/b/kimhamil/archive/2008/03/15/the-often-non-difference-between-close-and-dispose.aspx
  • API开发人员可以在需要公开类时使用它们来实现一个接口,其实现只应在其程序集中使用。在这种情况下,接口将使用 internal 关键字声明,并且它们面向公众的类将显式实现接口。最终结果是,只有程序集中的代码才能将类的实例强制转换为内部接口并访问其实现,而程序集外的调用者则不能。

这些是想到的用例;我确定还有其他我没有列出的。