【问题标题】:Why do many Base Class Library classes have Explicit Interface Implementation members?为什么许多基类库类都有显式接口实现成员?
【发布时间】:2012-07-10 20:54:56
【问题描述】:

MSDN:System.Type

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

我了解,当基本接口的成员之间存在名称冲突时,我们必须使用显式接口实现。但是为什么在上述情况下我们必须使用显式接口实现呢?与哪些接口存在名称冲突?

【问题讨论】:

  • 您的标题抱怨只有少数 BCL 类使用显式接口实现,但您的问题主体说许多 BCL 类都有它。是哪个?
  • Type 类是特殊的。提到这些是因为它们对 COM 很重要。 _Type 和 _MemberInfo 接口是 [ComVisible] 并且对于自定义 CLR 托管很重要。在 COM 中隐藏方法实现是正常的。 AppDomain 是另一个例子。

标签: c# .net


【解决方案1】:

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

这在以下情况下很有用:

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

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

【讨论】:

  • 感谢您的解释。
猜你喜欢
  • 2017-01-12
  • 2013-09-30
  • 2014-01-23
  • 2011-04-20
  • 2012-05-14
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
相关资源
最近更新 更多