C#接口。隐式实现与显式实现

10 浏览
0 Comments

C#接口。隐式实现与显式实现

在C#中,隐式实现接口显式实现接口有哪些不同之处?

应该在什么时候使用隐式实现和显式实现?

一种方式与另一种方式相比,有什么优点和/或缺点吗?


微软的官方指南(来自第一版框架设计指南)指出,不建议使用显式实现接口,因为它会给代码带来意外的行为。

我认为,这个指南在一个IoC之前的时间非常有效,当您不把接口作为参数传递时。

是否有人也能谈谈这方面呢?

admin 更改状态以发布 2023年5月23日
0
0 Comments

隐式定义是直接将接口要求的方法/属性等作为公共方法添加到类中。

显式定义强制要求成员仅在直接使用接口而不是底层实现时暴露。这在大多数情况下都是首选。

  1. 通过直接使用接口,您不会承认并将代码耦合到底层实现。
  2. 如果您在代码中已经有一个公共属性名称,而您想实现一个具有名称属性的接口,则显式执行将使这两个属性分开。即使它们正在做同样的事情,我仍然会将显式调用委托给名称属性。您永远不知道,您可能会在稍后更改类的名称工作方式以及名称接口属性的方式。
  3. 如果您隐式实现接口,则您的类现在会暴露新的行为,这些行为仅对接口的客户端相关,并且意味着您的类不够简洁(我的意见)。
0
0 Comments

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.

我主要使用显式实现来保持实现的清晰,或者当我需要两种实现时使用。无论如何,我很少使用它。

我相信还有更多的原因可以使用/不使用显式实现,其他人会在此帖中发帖提出优秀的原因。

请参见此线程中的下一个帖子,其中提供了每个原因的出色论据。

0