我对c#中的yield
关键字有一个模糊的理解,但我还没有看到在我的代码中使用它的必要性。这可能源于对它缺乏了解。
那么,yield
的一些典型好用法是什么?
答案 0 :(得分:14)
yield
只是让实现枚举器变得非常简单。因此,如果您想编写一个返回IEnumerable<T>
的方法,则可以节省您必须创建枚举器类 - 您只需yield
一次一个结果,编译器将负责详细介绍。< / p>
一个方便的案例是编写一个“无限枚举器”,调用者可以根据需要多次调用它。这是一个生成无限系列Fibonacci数的例子:http://chrisfulstow.com/fibonacci-numbers-iterator-with-csharp-yield-statements/(嗯...... 理论上无限,但实际上仅限于UInt64的大小)。
答案 1 :(得分:4)
Yield实现了延迟加载的模式。我建议从这个角度考虑它的用处。
例如。在我正在开发的商业软件环境中,它可以带来降低数据库负载的优势。您编写的代码可以从数据库中提取各种数据,但只会加载特定方案所需的部分。如果用户没有深入UI,则不会加载相应的数据。
答案 2 :(得分:4)
产量用于枚举器。 C#编译器会自动暂停枚举循环的执行,并将当前值返回给调用者。
IEnumerable<int> GetIntegers(int max) {
for(int i = 1; i <= max) {
yield return i; // Return current value to the caller
}
}
- 或(更笨重) -
IEnumerable<int> GetIntegers(int max) {
int count = 0;
while(true) {
if(count >= max) yield break; // Terminate enumeration
count++;
yield return count; // Return current value to the caller
}
}
有关MSDN的更多详情。
答案 3 :(得分:3)
当您只想测试IEnumerable&lt;&gt;时,测试和模拟也相当不错很快,像... ...
yield return somevalue;
yield return someothervalue;
yield return yetanotherone;