内容简介:当你升级到 C# 8.0 和 .NET Core 3.0 之后,你就可以开始使用默认接口实现的功能了。从现在开始,你可以在接口里面添加一些默认实现的成员,避免在接口中添加成员导致大量对此接口的实现崩溃。要写出并且正常使用接口的默认实现,你需要:
当你升级到 C# 8.0 和 .NET Core 3.0 之后,你就可以开始使用默认接口实现的功能了。
从现在开始,你可以在接口里面添加一些默认实现的成员,避免在接口中添加成员导致大量对此接口的实现崩溃。
最低要求
要写出并且正常使用接口的默认实现,你需要:
- C# 8.0
- .NET Core 3.0
- Visual Studio 2019 Preview (16.1 以上版本)
下载安装 Visual Studio 2019 Preview 版本
- 前往下载安装 Visual Studio Preview
开启 .NET Core 3.0 的支持
对于预览版的 Visual Studio 2019 来说,.NET Core 的预览版是默认打开且无法关闭的,所以不需要关心。
开启 C# 8.0 支持
请设置你项目的属性,修改 C# 语言版本为 8.0(对于预览版的语言来说,这是必要的):
或者直接修改你的项目文件,加上 LangVersion 属性的设置,设置为 8.0 。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
</Project>
默认接口实现
以前的做法
比如,我们现在有下面这样一个简单的接口:
public interface IWalterlv
{
void Print(string text);
}
这个接口被大量实现了。
现在,我们需要在接口中新增一个方法 DouBPrint ,其作用是对 Print 方法进行标准化,避免各种不同实现带来的标准差异。于是我们新增一个方法:
public interface IWalterlv
{
void Print(string text);
++ void DouBPrint(string text);
}
然而我们都知道,这样的修改是破坏性的:
- 会使得所有实现这个接口的代码全部失败(无法编译通过,或者运行时抛出异常)
- 我们依然很难将接口的实现标准化,靠文档来规约
默认接口实现
那么现在,我们可以这样来新增此方法:
public interface IWalterlv
{
void Print(string text);
-- void DouBPrint(string text);
++ public void DouBPrint(string text) => Print($"Walterlv 逗比 {text}");
}
在使用此方法来定义此接口中的方法后,那些没来得及实现此方法的类型也可以编译通过并获得标准化的实现。
class Program
{
static void Main(string[] args)
{
IWalterlv walterlv = new Foo();
walterlv.DouBPrint("walterlv");
}
}
public class Foo : IWalterlv
{
public void Print(string text)
{
}
}
当然,对于 Foo 类型来说,实现也是可以的:
public class Foo : IWalterlv
{
public void Print(string text)
{
}
public void DouBPrint(string text) => Print($"Walterlv 逗比 {text}");
}
静态字段和方法
除此之外,在接口中还可以编写静态字段和静态方法,这可以用来统一接口中的一些默认实现。
意味着,如果类没有实现接口中带有默认实现的方法,那么具有默认的实现;而如果类中打算实现接口中的带有默认实现的方法,那么也可以调用接口中的静态方法来进行实现。
public interface IWalterlv
{
void Print(string text);
-- public void DouBPrint(string text) => Print($"Walterlv 逗比 {text}");
++ public void DouBPrint(string text) => DefaultDouBPrint(this, text);
++
++ private static readonly string _name = "walterlv";
++
++ protected static void DefaultDouBPrint(IWalterlv walterlv, string text)
++ => walterlv.Print($"{_name} 逗比 {text}");
}
然后,对于实现方,则需要使用接口名来调用接口中的静态成员:
public class Foo : IWalterlv
{
public void Print(string text)
{
}
-- public void DouBPrint(string text) => Print($"Walterlv 逗比 {text}");
++ public void DouBPrint(string text)
++ {
++ // Do Other things.
++ IWalterlv.DefaultDouBPrint(this, text);
++ }
++ }
参考资料
- Default implementations in interfaces - .NET Blog
- Visual Studio 2019 version 16.1 Preview 3 - The Visual Studio Blog
- Safely update interfaces using default interface members in C# - Microsoft Docs
以上所述就是小编给大家介绍的《C# 8.0 中开启默认接口实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
马云现象的经济学分析:互联网经济的八个关键命题
胡晓鹏 / 上海社会科学院出版社 / 2016-11-1 / CNY 68.00
互联网经济的产生、发展与扩张,在冲击传统经济理论观点的同时,也彰显了自身理论体系的独特内核,并与那种立足于工业经济时代的经典理论发生显著分野。今天看来,“马云”们的成功是中国经济长期“重制造、轻服务,重产能、轻消费,重国有、轻民营”发展逻辑的结果。但互联网经济的发展却不应仅仅止步于商业技巧的翻新,还需要在理论上进行一番审慎的思考。对此,我们不禁要问:互联网经济驱动交易发生的机理是什么?用户基数和诚......一起来看看 《马云现象的经济学分析:互联网经济的八个关键命题》 这本书的介绍吧!