在阅读C#中的yield关键字时,让我感到震惊的是,似乎与使用函数内部声明的静态变量有一些相似之处,例如可以在C中完成。
这两种方法都是在调用之间保存函数状态的方法,而不会在函数外部暴露这个事实。
第一个问题:两者在如何保存功能状态方面有何不同?
第二个问题:保存函数状态的设计含义是什么?我看到一些基于产量的“黑客”,似乎是一场等待发生的灾难。除了可枚举集合之外是否还有其他任何情况可以从这个设计中获益?
答案 0 :(得分:3)
C#yield
看起来非常像Python中的yield
。如果
所以,它更接近于协同进程而不是静态变量:
保存函数的整个状态。 (回到过去,
我们在英特尔实施协同流程的方式是交换
具有内存位置的堆栈指针:xchg sp,
otherCoprocessStack
。)
至于优点,它比重量轻得多 定义一个单独的线程,并通过一些线程与之通信 排队机制。它特别有用 迭代复杂的内存结构,如树,因为它 避免必须手动维护堆栈。