在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);
                }
            }
        }
    }
}

迭代。它创建了一个“隐藏”的状态机,它记住了每个额外的函数循环的位置,然后从那里读取。

未经作者同意,本文严禁转载,违者必究!