时间:2021-4-5来源:本站原创作者:佚名
遗传性白癜风能治好吗 https://m-mip.39.net/baidianfeng/mipso_4684529.html
C#9新特性——增强的foreachIntro

在C#9中增强了foreach的使用,使得一切对象都有foreach的可能

我们来看一段代码,这里我们试图遍历一个int类型的值

思考一下,我们可以怎么做使得上面的代码编译通过呢?

迭代器模式

迭代器模式,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

迭代器模式是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。

foreach其实是一个迭代器模式的语法糖,用来遍历一个集合中的数据,foreach可以使用while来实现,比如下面这个示例:

varenumerable=Enumerable.Range(1,10).ToArray();foreach(variinenumerable){Console.WriteLine(i);}

使用while重写之后类似下面这样的代码:

varenumerator=enumerable.GetEnumerator();while(enumerator.MoveNext()){Console.WriteLine(enumerator.Current);}

c#中的集合基本都实现了迭代器模式,可以直接使用foreach来遍历,对于自定义的类型想要支持foreach可以实现IEnumerable或IEnumerableT,对于没有实现迭代器的代码,是不是可以用foreach呢

Enumerator

我们再来看开篇提到的问题,怎么实现支持foreach呢

vstips

从上面VS的提示我们可以看得出来,如果一个类型想要支持foreach,有三种方式可以实现:

实现IEnumerable实现IEnmuerableT添加GetEnumerator方法,方法返回值类型需要有Current属性和MoveNext方法,可以参考这个IEnumerator,返回类型可以直接实现IEnumerator或IEnumeratorT

那么如果是一个别人封装的类型,能否支持foreach呢,从C#9之后就可以了,可以添加一个GetEnumerator的扩展方法,类似于下面

publicstaticclassForEachExtensions{publicstaticIEnumeratorcharGetEnumerator(thisintnum){returnnum.ToString().GetEnumerator();}}

此时如果是使用C#9就可以编译通过了,如果手动设置了LangVersion,需要修改为9,否则会得到类似下面这样的错误

添加使用扩展方法,并启用C#9语法:

More

有了这个功能之后,一切类型都是可以foreach的,没有实现迭代器模式的类型,只需要实现一个扩展方法就可以了

迎接C#9,万物皆可foreach~~

Reference
转载请注明原文网址:http://www.helimiaopu.com/bbqb/bbqb/9357.html
------分隔线----------------------------