怎么在c# 8.0项目中开启默认接口?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
<强>开启。net 3.0核心的支持强>
对于预览版的Visual Studio 2019来说,。网络核心的预览版是默认打开且无法关闭的,所以不需要关心。
<强>开启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项目中开启默认接口