怎么在c# 8.0项目中开启默认接口

  介绍

怎么在c# 8.0项目中开启默认接口?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>开启。net 3.0核心的支持

对于预览版的Visual Studio 2019来说,。网络核心的预览版是默认打开且无法关闭的,所以不需要关心。

<强>开启c# 8.0支持

请设置你项目的属性,修改c#语言版本为8.0(对于预览版的语言来说,这是必要的):

怎么在c# 8.0项目中开启默认接口

或者直接修改你的项目文件,加上<代码>比如LangVersion 属性的设置,设置为8.0 <代码>

& lt; Project  Sdk=癕icrosoft.NET.Sdk"比;      ,& lt; PropertyGroup>   & lt;才能OutputType> Exe</OutputType>   & lt;才能TargetFramework> netcoreapp3.0</TargetFramework>   & lt;才能LangVersion> 8.0 & lt;/LangVersion>   ,& lt;/PropertyGroup>      & lt;/Project>

<强>默认接口实现

, <强>以前的做法

比如,我们现在有下面这样一个简单的接口:

public  interface  IWalterlv   {   void 才能打印(string 文本);   }

这个接口被大量实现了。

现在,我们需要在接口中新增一个方法<代码> DouBPrint> 打印方法进行标准化,避免各种不同实现带来的标准差异。于是我们新增一个方法:

, public  interface  IWalterlv   {才能   ,,,void 打印(string 文本);      + +,,,void  DouBPrint (string 文本);   以前,,}

然而我们都知道,这样的修改是破坏性的:

<李>

会使得所有实现这个接口的代码全部失败(无法编译通过,或者运行时抛出异常)

<李>

我们依然很难将接口的实现标准化,靠文档来规约

<强>默认接口实现

那么现在,我们可以这样来新增此方法:

, public  interface  IWalterlv   {才能   ,,,void 打印(string 文本);   ,,,,   ,,,,void  DouBPrint (string 文本);   + +,,,public  void  DouBPrint (string 文本),=祝辞,打印(美元“Walterlv 逗比,{文本}“);   以前,,}

在使用此方法来定义此接口中的方法后,那些没来得及实现此方法的类型也可以编译通过并获得标准化的实现。

class 程序   {   static 才能;void  Main (string [], args)   {才能   ,,,IWalterlv  walterlv =, new  Foo ();   ,,,walterlv.DouBPrint (“walterlv");   ,,}   }      public  class  Foo : IWalterlv   {   public 才能;void 打印(string 文本)   {才能   ,,}   }

当然,对于<代码> Foo> public  class  Foo : IWalterlv   {   public 才能;void 打印(string 文本)   {才能   ,,}      public 才能;void  DouBPrint (string 文本),=祝辞,打印(美元“Walterlv 逗比,{文本}“);   }

<>强静态字段和方法

除此之外,在接口中还可以编写静态字段和静态方法,这可以用来统一接口中的一些默认实现。

意味着,如果类没有实现接口中带有默认实现的方法,那么具有默认的实现;而如果类中打算实现接口中的带有默认实现的方法,那么也可以调用接口中的静态方法来进行实现。

, public  interface  IWalterlv   {才能   ,,,void 打印(string 文本);      ,,,,public  void  DouBPrint (string 文本),=祝辞,打印(美元“Walterlv 逗比,{文本}“);   + +,,,public  void  DouBPrint (string 文本),=祝辞,DefaultDouBPrint(,,文本);   ++   + +,,,private  static  readonly  string  _name =,“walterlv";   ++   + +,,,protected  static  void  DefaultDouBPrint (IWalterlv  walterlv, string 文本)   + +,,,,,=祝辞,walterlv.Print(美元“{_name},逗比,{文本}“);   以前,,}

然后,对于实现方,则需要使用接口名来调用接口中的静态成员:

,, public  class  Foo : IWalterlv   {才能   ,,,public  void 打印(string 文本)   ,,,{   ,,,}      ,,,,public  void  DouBPrint (string 文本),=祝辞,打印(美元“Walterlv 逗比,{文本}“);   + +,,,public  void  DouBPrint (string 文本)   + +,,,{   + +,,,,,//Do  Other 事情。   + +,,,,,IWalterlv.DefaultDouBPrint(,,文本);   + +,,,}   + +,}

怎么在c# 8.0项目中开启默认接口