遗传性白癜风能治好吗 https://m-mip.39.net/baidianfeng/mipso_4684529.htmlC#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 |