gpt4 book ai didi

c# - 在 C# 中使用的 yield 关键字是什么?

转载 作者:IT王子 更新时间:2023-10-29 03:27:04 26 4
gpt4 key购买 nike

How Can I Expose Only a Fragment of IList<>问题之一的答案具有以下代码片段:

IEnumerable<object> FilteredList()
{
foreach(object item in FullList)
{
if(IsItemInPartialList(item))
yield return item;
}
}

yield 关键字在那里做什么?我已经在几个地方和另一个问题中看到它被引用,但我还没有完全弄清楚它实际上做了什么。我习惯于在一个线程屈服于另一个线程的意义上考虑 yield ,但这在这里似乎并不相关。

最佳答案

yield上下文关键字实际上在这里做了很多。

该函数返回一个实现 IEnumerable<object> 的对象界面。如果调用函数开始foreach在这个对象上,该函数被再次调用,直到它“屈服”。这是 C# 2.0 中引入的语法糖。在早期版本中,您必须创建自己的 IEnumerableIEnumerator对象做这样的事情。

理解这样的代码最简单的方法是输入一个例子,设置一些断点,看看会发生什么。尝试单步执行此示例:

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

关于c# - 在 C# 中使用的 yield 关键字是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com