关于此,有一篇很好且非常详细的博客文章.
基本上使用隐式接口实现,您可以访问接口方法和属性,就好像它们是类的一部分一样.使用显式接口实现,您只能在将其视为该接口时访问它们.
就何时使用一个而不是另一个而言,有时您必须使用显式接口实现,因为您要么具有与接口具有相同签名的属性/方法,要么您希望实现具有相同签名的两个接口并具有不同的实现匹配的那些属性/方法.
以下规则来自Brad Abrams 设计指南博客.
不要使用显式成员作为安全边界.任何将实例强制转换为接口的客户端都可以调用它们.
请使用明确的成员隐藏实现细节
请使用明确的成员来近似专用接口的实现.
请公开另一种方法来访问允许子类重写的任何显式实现的成员.除非出现冲突,否则请使用相同的方法名称.
Brad的博客评论中也提到,在对值类型使用显式实现时会涉及到拳击,因此请注意性能成本.
关于此,有一篇很好且非常详细的博客文章.
基本上使用隐式接口实现,您可以访问接口方法和属性,就好像它们是类的一部分一样.使用显式接口实现,您只能在将其视为该接口时访问它们.
就何时使用一个而不是另一个而言,有时您必须使用显式接口实现,因为您要么具有与接口具有相同签名的属性/方法,要么您希望实现具有相同签名的两个接口并具有不同的实现匹配的那些属性/方法.
以下规则来自Brad Abrams 设计指南博客.
不要使用显式成员作为安全边界.任何将实例强制转换为接口的客户端都可以调用它们.
请使用明确的成员隐藏实现细节
请使用明确的成员来近似专用接口的实现.
请公开另一种方法来访问允许子类重写的任何显式实现的成员.除非出现冲突,否则请使用相同的方法名称.
Brad的博客评论中也提到,在对值类型使用显式实现时会涉及到拳击,因此请注意性能成本.
通俗地说,如果一个类继承自2个或更多接口,并且接口碰巧具有相同的方法名称,则如果使用隐式接口实现,则该类不知道正在实现哪个接口方法.这是您明确实现接口的方案之一.
隐式接口实现
public class MyClass : InterfaceOne, InterfaceTwo { public void InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } } interface InterfaceOne { void InterfaceMethod(); } interface InterfaceTwo { void InterfaceMethod(); }
显式接口实现
public class MyClass : InterfaceOne, InterfaceTwo { void InterfaceOne.InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } void InterfaceTwo.InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } } interface InterfaceOne { void InterfaceMethod(); } interface InterfaceTwo { void InterfaceMethod(); }
以下链接有一个很好的视频,解释了这个概念
显式接口实现