在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?