Possible Duplicate:
C#: Interfaces - Implicit and Explicit implementation

有人能解释一下这两种动物的区别以及如何使用它们吗.好吧,很多人.2.0类是在没有泛型类型的情况下实现的,因此后一个版本实现了两种风格的接口.这是唯一需要使用它们的情况吗?

你能详细解释一下如何使用它们吗.?

谢谢

推荐答案

There is a good and pretty detailed blog post about this.

基本上,通过隐式接口实现,您可以访问接口方法和属性,就像它们是类的一部分一样.通过显式接口实现,您只能在将其视为该接口时访问它们.

关于何时使用一个接口而不是另一个接口,有时您必须使用显式接口实现,因为您要么拥有与接口具有相同签名的属性/方法,要么想要实现具有相同签名的两个接口,并且对匹配的属性/方法具有不同的实现.

以下规则来自Brad Abrams design guidelines blog.

  • Do not使用显式成员作为安全边界.任何向接口强制转换实例的客户端都可以调用它们.
  • Do使用显式成员隐藏实现细节
  • Do使用显式成员来近似私有接口实现.
  • Do公开了一种访问允许子类重写的任何显式实现的成员的替代方法.除非会出现冲突,否则请使用相同的方法名称.

Brad的博客 comments 中还提到,在对值类型使用显式实现时会涉及装箱,因此要注意性能成本.

.net相关问答推荐

每当属性值发生变化时引发事件?

CurrentCulture、InvariantCulture、CurrentUICulture 和 InstalledUICulture 之间的区别

每 X 秒执行一次指定函数

从 Web.Config 中的邮箱友好显示名称存储 Smtp

数据库架构更改后更新 LINQ to SQL 类的最佳方法

如何将 UI Dispatcher 传递给 ViewModel

Await 运算符只能在 Async 方法中使用

如何从 .NET 中的流中获取 MemoryStream?

我不了解应用程序域

在未安装 Visual Studio 的机器上使用 FUSLOGVW.EXE

使用 C# 设置全局热键

C# 中的 F# List.map 类似功能?

使用 DateTime.ToString() 时获取日期后缀

IronPython 与 Python .NET

为什么 !0 是 Microsoft 中间语言 (MSIL) 中的一种类型?

如何将 MailMessage 对象作为 *.eml 或 *.msg 文件保存到磁盘

使用 C# 将时间跨度值转换为格式hh:mm Am/Pm

如何修改 KeyValuePair 值?

从 Visual Studio 2015 发布 - 允许不受信任的证书

如何在我的机器上找到 fuslogvw.exe?