1

MSDN:系统类型

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

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

4

1 回答 1

2

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

这在以下情况下很有用:

  • 类作者认为接口的实现只在极少数情况下使用,并且为了可用性默认应该隐藏(这显然是Type类的情况,因为显式接口实现是特定于 COM 的)
  • 一个类实现了两个或多个具有公共方法/属性签名的接口,但有必要根据接口提供不同的实现,因为接口在方法签名之外具有隐式但不同的行为契约(Type类也有这样的示例;大概 _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关键字声明,并且其面向公众的类将显式实现该接口。最终结果是只有程序集中的代码才能将类的实例转换为内部接口并访问其实现,而程序集之外的调用者则不能。

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

于 2012-07-11T00:34:49.607 回答