如何做html网站,优化大师app下载安装,西宁网站制作费用是多少钱,电子设计全国网站建设C# 9 新特性 —— 增强的 foreachIntro在 C# 9 中增强了 foreach 的使用#xff0c;使得一切对象都有 foreach 的可能我们来看一段代码#xff0c;这里我们试图遍历一个 int 类型的值思考一下#xff0c;我们可以怎么做使得上面的代码编译通过呢#xff1f;迭代器模式迭代器… C# 9 新特性 —— 增强的 foreachIntro在 C# 9 中增强了 foreach 的使用使得一切对象都有 foreach 的可能我们来看一段代码这里我们试图遍历一个 int 类型的值思考一下我们可以怎么做使得上面的代码编译通过呢迭代器模式迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素而又不暴露该对象的内部表示。迭代器模式是分离了集合对象的遍历行为抽象出一个迭代器类来负责这样既可以做到不暴露集合的内部结构又可以让外部代码透明地访问集合内部的数据。foreach 其实是一个迭代器模式的语法糖用来遍历一个集合中的数据foreach 可以使用 while 来实现比如下面这个示例var enumerable Enumerable.Range(1, 10).ToArray();
foreach (var i in enumerable)
{Console.WriteLine(i);
}
使用 while 重写之后类似下面这样的代码var enumerator enumerable.GetEnumerator();
while (enumerator.MoveNext())
{Console.WriteLine(enumerator.Current);
}
c# 中的集合基本都实现了迭代器模式可以直接使用 foreach 来遍历对于自定义的类型想要支持 foreach 可以实现 IEnumerable 或 IEnumerableT对于没有实现迭代器的代码是不是可以用 foreach 呢Enumerator我们再来看开篇提到的问题怎么实现支持 foreach 呢vs tips从上面 VS 的提示我们可以看得出来如果一个类型想要支持 foreach有三种方式可以实现实现 IEnumerable实现 IEnmuerableT添加 GetEnumerator 方法方法返回值类型需要有 Current 属性和 MoveNext 方法可以参考这个 IEnumerator返回类型可以直接实现 IEnumerator 或 IEnumeratorT那么如果是一个别人封装的类型能否支持 foreach 呢从 C# 9 之后就可以了可以添加一个 GetEnumerator 的扩展方法类似于下面public static class ForEachExtensions
{public static IEnumeratorchar GetEnumerator(this int num){return num.ToString().GetEnumerator();}
}
此时如果是使用 C# 9 就可以编译通过了如果手动设置了 LangVersion需要修改为 9否则会得到类似下面这样的错误添加使用扩展方法并启用 C# 9 语法More有了这个功能之后一切类型都是可以 foreach 的没有实现迭代器模式的类型只需要实现一个扩展方法就可以了迎接 C# 9 万物皆可 foreach ~~Referencehttps://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp9Samplehttps://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/ForEachExtensions.cs