.jpg)
在“如何仅公开 IList<> 的一个片段”中,其中一个答案具有以下代码片段:
IEnumerable<object> FilteredList()
{
foreach(object item in FullList)
{
if(IsItemInPartialList(item))
yield return item;
}
}
yield 关键字在那里做什么?我已经在几个地方看到它被引用,还有一个问题,但我还没有完全弄清楚它实际上做了什么。我习惯于将产量视为一个线程屈服于另一个线程,但这在这里似乎无关紧要。
网友回答:
迭 代。它创建一个“幕后”状态机,该状态机记住您在函数的每个附加周期中的位置,并从那里开始。
网友回答:
产量有两个很大的用途,
为了更能说明以上两点,我制作了一个简单的视频,你可以在这里观看
网友回答:
上下文关键字实际上在这里做了很多事情。yield
该函数返回实现接口的对象。如果调用函数开始在此对象上,则会再次调用该函数,直到它“屈服”。这是 C# 2.0 中引入的语法糖。在早期版本中,您必须创建自己的对象和对象才能执行此类操作。IEnumerable<object>foreachIEnumerableIEnumerator
理解此类代码的最简单方法是键入示例,设置一些断点,然后查看会发生什么。尝试逐步完成此示例:
public void Consumer()
{
foreach(int i in Integers())
{
Console.WriteLine(i.ToString());
}
}
public IEnumerable<int> Integers()
{
yield return 1;
yield return 2;
yield return 4;
yield return 8;
yield return 16;
yield return 16777216;
}
单步执行示例时,您将找到对返回的第一个调用。第二个调用返回,并且不再执行该线路。Integers()12yield return 1
下面是一个现实生活中的例子:
public IEnumerable<T> Read<T>(string sql, Func<IDataReader, T> make, params object[] parms)
{
using (var connection = CreateConnection())
{
using (var command = CreateCommand(CommandType.Text, sql, connection, parms))
{
command.CommandTimeout = dataBaseSettings.ReadCommandTimeout;
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
yield return make(reader);
}
}
}
}
}
模板简介:该模板名称为【yield 关键字在那里做什么?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。