C# 如何选择是实现接口还是显式实现接口?

C# 如何选择是实现接口还是显式实现接口?,c#,interface,explicit-implementation,C#,Interface,Explicit Implementation,实现接口有两种方法: interface IMyInterface { void Foo(); } class IImplementAnInterface : IMyInterface { public void Foo() { } } // var foo = new IImplementAnInterface(); // foo.Foo(); //Ok // ((IMyInterface)foo).Foo(); //Ok class IExplicitly

实现接口有两种方法:

interface IMyInterface
{
    void Foo();
}

class IImplementAnInterface : IMyInterface
{
    public void Foo()
    {
    }
}
// var foo = new IImplementAnInterface();
// foo.Foo(); //Ok
// ((IMyInterface)foo).Foo(); //Ok

class IExplicitlyImplementAnInterface : IMyInterface
{
    void IMyInterface.Foo()
    {
    }
}
// var foo = new IExplicitlyImplementAnInterface();
// foo.Foo(); //ERROR!
// ((IMyInterface)foo).Foo(); //Ok
区别在于,如果接口是显式实现的,那么在允许某人调用
Foo
方法之前,它实际上必须被转换为给定的接口

如何决定使用哪个?

如果存在冲突(两个接口有一个具有相同签名的方法,或者您的类/基类和一个接口以相同的方式冲突),并且您不希望冲突的方法具有相同的主体,那么您必须使用显式接口


否则,你可以自由选择。如果要隐藏某些已实现的方法,请选择显式方法。例如,Dictionary类使用ICollection接口的某些方法执行此操作,因为隐藏的方法会让人感到困惑。

有些情况下,您必须提供显式实现,例如在实现IEnumerable和IEnumerable时,两个接口都公开了一个
GetEnumerator
方法

我遵循的一条一般规则是,如果我实现了一个接口,但提供了其他更方便和类型安全的方法和属性来公开接口功能,那么我将完全实现该接口。这使得类公开的公共接口更合适,同时仍然允许可能依赖于实现接口的算法访问接口提供的方法和属性


这很难说,但我希望它有一定的意义。

我只建议在实现多个接口的情况下使用它,并且它们都包含相同名称的方法

您还可以显式地实现一个方法来有效地“隐藏”它,并实现一个具有更好名称的等效方法。System.IO.Stream执行此操作,显式实现Dispose并提供更好的Close()


有关更多信息,请参阅这篇MSDN文章:。

这通常被视为.NET禁止“返回类型协方差”的一种变通方法。

NB:public中的第二个声明无效。您不需要访问修饰符,因为显式实现的接口成员是自动设置为私有的。@Mark H:谢谢,并已修复。我认为您的问题的答案完全是主观的,取决于您试图解决的问题。@asawyer:是的--我在寻找一般的经验法则--不一定是福音。