【5min+】 巨大的争议?C# 8 中的接口

系列介绍

【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。
5min+不是超过5分钟的意思,"+"是知识的增加。so,它是让您花费5分钟以下的时间来提升您的知识储备量。

正文

伴随着 .NET Core 3.0 一起发布的 C# 8 ,从发布至今已经过了快大半年了。如果您细心的话,就能发现在C# 8新增的功能中有一条:“默认接口方法” 。 半年前当我看到这一新特性的时候,我惊呆了,但是惊讶之余是更多的疑惑。因为对于接口这个东西来说,从C#发布至今的十多年里几乎一直保持它的样子,然而在C# 8之后,它有了巨大的变化。随着而来,也是各种争论的声音。

很早之前我就想写这篇文章了,但是由于各种原因一直拖延到了现在。

先让我们来回顾一下 C# 中原有的接口有什么特点:

  • 接口类似于只有抽象成员的抽象基类。 实现接口的任何类或结构都必须实现其所有成员。
  • 接口无法直接进行实例化。 其成员由实现接口的任何类或结构来实现。
  • 接口可以包含事件、索引器、方法和属性。
  • 接口不含方法的实现。
  • 一个类或结构可以实现多个接口。 一个类可以继承一个基类,还可实现一个或多个接口。

也正是基于这些特点,当我们在接口中为一个方法加上"pulic"等关键字的时候,编译器会提示我们这是一个错误的写法:

复制代码

interface IRepository
{
    //Compile-time error CS0106 The modifier 'public' is not valid for this item.
    public void Add();
}

所以更不用谈给方法写一个实现了。这就让它和 C# 中的另外一种事物行成了鲜明的对比,是的,抽象类。不知道大家有没有在各种面试中遇到过这样的提问:“接口能有任何的访问修饰符吗?”,“接口和抽象类的区别是什么?”

曾经您可以和自然的脱口而出答案:“没有修饰符。一个可以有默认方法,一个只能申明方法…………”。 但是从现在开始:这些答案是错的了。

上一篇:Java学习 使用注解将参数的值限定


下一篇:如何打开uboot的函数debug()的开关,输出更多调试信息?