在C#中实现接口implicitlyexplicitly有什么区别?

什么时候应该使用隐式,什么时候应该使用显式?

其中一个有什么优点和/或缺点吗?


Microsoft's official guidelines (from first edition Framework Design Guidelines) states that using explicit implementations are not recommended, since it gives the code unexpected behaviour.

我认为当你不把东西作为接口传递的时候,这个准则非常有用.

有人能谈谈这方面吗?

推荐答案

Implicit是指通过类中的成员定义接口.Explicit是指在接口上的类中定义方法.我知道这听起来很困惑,但我的意思是:IList.CopyTo将被隐式实现为:

public void CopyTo(Array array, int index)
{
    throw new NotImplementedException();
}

明确地说:

void ICollection.CopyTo(Array array, int index)
{
    throw new NotImplementedException();
}

不同之处在于,隐式实现允许您通过您创建的类访问接口,方法是将接口转换为该类和接口本身.显式实现允许您仅通过将接口强制转换为接口本身来访问该接口.

MyClass myClass = new MyClass(); // Declared as concrete class
myclass.CopyTo //invalid with explicit
((IList)myClass).CopyTo //valid with explicit.

我使用explicit主要是为了保持实现的干净,或者当我需要两个实现时.不管怎样,我很少使用它.

我相信有更多的理由使用/不使用其他人将发布的明确信息.

请参阅本文中的next post条,了解每一条背后的优秀推理.

.net相关问答推荐

我的Azure应用服务从哪里获取应用设置?

避免函数和其他对象之间的相互递归的模式?

Dotnet 反射:使用 F# 中的out参数调用 MethodInfo 上的调用

.NET 4.5 项目未在 Visual Studio 2022 中编译

查找所有源硬编码字符串

在 C# 中输入按键

在 ASP.NET MVC 中我可以在哪里放置自定义类?

Gacutil.exe 成功添加程序集,但在资源管理器中无法查看程序集.为什么?

泛型方法是如何、何时、何地具体化的?

BackgroundWorker 中未处理的异常

如何右对齐 DataGridView 列中的文本?

在 Moq Callback() 调用中设置变量值

如何使用 NUnit(或可能使用另一个框架)测试异步方法?

实体框架 - 无法将 lambda 表达式转换为类型字符串,因为它不是委托类型

从 .NET 中的字符串末尾修剪字符串 - 为什么会丢失?

X509Certificate 构造函数异常

是否有可用的 WPF 备忘单?

更改 SqlConnection 超时

obj 文件夹是为了什么而生成的?

System.IO.IOException:使用 System.IO.Path.GetTempFileName() 时文件存在 - 解决方案?