在C#中使用的yield关键字是什么?
在我如何公开只有一个IList <>的问题问题之一的答案有以下代码片段:
IEnumerable<object> FilteredList()
{
foreach( object item in FullList )
{
if( IsItemInPartialList( item )
yield return item;
}
}
yield关键字在那里做什么? 我已经在几个地方看到了它的引用,还有一个问题,但我还没有弄清楚它的实际功能。 我习惯于从一个线程产生另一个线程的意义上考虑产量,但在这里看起来并不相关。
yield关键字在这里确实做了很多。 该函数返回一个实现IEnumerable接口的对象。 如果一个调用函数开始对这个对象进行foreach,那么函数会被再次调用,直到它“屈服”。 这是C#2.0中引入的语法糖。 在早期版本中,您必须创建自己的IEnumerable和IEnumerator对象来执行这样的操作。
理解这样的代码最简单的方法是键入一个例子,设置一些断点并查看会发生什么。
尝试通过这个例如:
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()返回1.第二次调用返回2,并且行“yield 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);
}
}
}
}
}
迭代。 它创建了一个“隐藏”的状态机,它记住了每个额外的函数循环的位置,并从那里开始。
收益率有两大用途,
它有助于提供自定义迭代而不创建临时集合。
它有助于进行有状态的迭代。
为了更加明确地解释以上两点,我创建了一个简单的视频,你可以在这里观看
链接地址: http://www.djcxy.com/p/165.html上一篇: What is the yield keyword used for in C#?
下一篇: What does ** (double star/asterisk) and * (star/asterisk) do for parameters?