C#中yield
C#中yield
C#中yield一、C#中yield关键字用于遍历循环中,yield语句的两种形式
yield return用于返回IEnumerable<T>,
yield break用于终止循环遍历。
二、yield return的用法
使用yield return获取集合,并遍历。
class Program
{
public static Random r = new Random();
static IEnumerable<int> GetList(int count)
{
for (int i = 0; i < count; i++)
{
yield return r.Next(10);
}
}
static void Main(string[] args)
{
foreach(int item in GetList(5))
Console.WriteLine(item);
Console.ReadKey();
}
}
生成项目,并用反编译可执行文件。查看GetList方法,发现该方法返回的是一个GetList类的实例。原来yield return是"语法糖",其本质是生成了一个GetList的实例。
那GetList实例是什么呢?点击反编译工具中<GetList>链接查看
分析代码后可以知道
1、原来GetList类实现了IEnumerable和IEnumerator的泛型、非泛型接口
2、yield return返回的集合之所以能被迭代、遍历,是因为GetList内部有迭代器
3、yield return之所以能实现"按需供给",是因为GetList内部有一个_state字段记录这上次的状态
三、yield break的用法
使用yield break可以在获取集合的时候,当符合某种条件就终止获取集合。
class Program
{
static Random rand = new Random();
static IEnumerable<int> GetList()
{
while (true)
{
int temp = rand.Next(100);
if (temp%10 == 0)
{
yield break;
}
yield return temp;
}
}
static void Main(string[] args)
{
foreach (int item in GetList())
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
四、C#中yield关键字的总结
1、yield return能返回一个"按需供给"的集合
2、yield return是"语法糖",其背后是一个实现了IEnuerable,IEnumerator泛型、非泛型接口的类,该类维护着一个状态字段,以保证yield return产生的集合能"按需供给"
3、yield break配合yield return使用,当产生集合达到某种条件的时候使用yield break,以终止继续创建集合
- SQL SERVER数据类型对应C#的数据类型
- C#中==、Equals、ReferenceEquals的区别
- C#中的readonly和const关键字
- C#中ToString()常见的格式
- C#中Dictionary的用法
- C#匿名类
- C#中typeof 与GetType()的区别
- C# volatile与lock
- C#验证身份证号码
- C#中BeginInvoke与EndInvoke
- C# Directory类的操作
- C#泛型List的用法
- C# 扩展方法
- c语言获取系统日期函数(C# ling to sql 取多条记录最大时间)
- C#enum枚举
- c#中SqlBulkCopy的使用
- 《金陵秘事》的剧情跌宕起伏 给观众带来的怎样的感官体验(金陵秘事的剧情跌宕起伏)
- 少儿口才表达影响未来一生,50首经典绕口令和孩子玩出聪明大脑(少儿口才表达影响未来一生)
- 玩网游居然让人更友善 很难以让人置信(玩网游居然让人更友善)
- 学好汉语拼音,从娃娃绕口令抓起,平时还是要多练 收藏好(从娃娃绕口令抓起)
- 仙女们的私藏鲜法大PK 鲜香切块牛肉(仙女们的私藏鲜法大PK)
- 天热没胃口 这道菜开胃又下饭,2个小技巧新手一学就会(这道菜开胃又下饭)
热门推荐
- 使用HighCharts制作图表
- python3.8基本操作(Python3.5文件修改操作实例分析)
- Visual Studio中 sln 和 suo 文件
- python怎么转换jar包(利用python脚本如何简化jar操作命令)
- 云服务器9兆带宽的上传速度是多少(云服务器网速多少怎么计算?云服务器的1兆带宽是多少的?)
- apache 配置域名(apache 二级域名解析 window与linux)
- Extjs中FieldSet的收缩和展开
- 使用npoi将数据导出到一个EXCEL的多SHEET
- 修改宝塔nginx端口(解决宝塔面板nginx/apache防火墙后无法启动)
- linux常用的参数类型和参数代码(浅析Linux resolv.conf)