C# 中 yield
关键字:迭代器与性能优化
yield
关键字在 C# 中扮演着至关重要的角色,它简化了枚举器的实现和迭代器的创建,显着提升了代码的可读性和性能。让我们深入了解其功能。
逐步返回结果 (Yielding Results
)
yield
关键字允许方法暂停其执行,并逐步返回结果。当调用函数迭代一个实现了 IEnumerable
接口的对象时,包含 yield
关键字的方法会被重复调用,直到返回序列结束。此机制称为“逐步返回”(yielding)。
例如,考虑以下代码片段:
<code class="language-csharp">IEnumerable<object> FilteredList() { foreach (object item in FullList) { if (IsItemInPartialList(item)) yield return item; } }</code>
FilteredList()
方法根据条件从 FullList
中逐步返回对象。当调用方迭代结果时,该方法会逐一返回每个匹配项。
实现迭代器 (Implementing Iterators
)
yield
关键字简化了自定义迭代器的创建。在 C# 的早期版本中,必须使用 IEnumerator
对象手动实现枚举器。 yield
提供了一种更简洁、更声明式的方法:
<code class="language-csharp">public IEnumerable<int> Integers() { yield return 1; yield return 2; yield return 4; yield return 8; yield return 16; yield return 16777216; }</code>
这段代码返回一个整数序列,无需显式迭代逻辑。
实际应用 (Real-Life Usage
)
在实际应用中,yield
常用于惰性求值场景,例如从数据库检索数据。考虑以下示例:
<code class="language-csharp">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); } } } } }</code>
此方法构造一个枚举器,从数据库表中获取记录,并根据提供的映射函数 make()
创建类型为 T 的对象。通过使用 yield
,该方法避免将整个结果集加载到内存中,从而在处理大型数据集时提高性能。
以上是'收益”关键字如何在C#中起作用以创建迭代器并提高性能?的详细内容。更多信息请关注PHP中文网其他相关文章!