Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
在阅读 C# 中的 yield 关键字时,让我感到震惊的是,使用在函数内声明的静态变量似乎有一些相似之处,例如可以在 C 中完成。
两者都是在调用之间保存函数状态而不将这一事实暴露在函数之外的方法。
第一个问题:两者在保存函数状态方面有什么区别?
第二个问题:像这样不透明地保存函数状态的设计含义是什么?我已经看到了一些基于产量的“黑客”,这似乎是一场等待发生的灾难。除了可枚举的集合之外,还有其他情况可以从这种设计中受益吗?
C#yield看起来很像yieldPython 中的。如果是这样,它更接近于协同进程而不是静态变量:保存函数的整个状态。(在过去,我们在 Intel 上实现协同进程的方式是将堆栈指针与内存位置交换:xchg sp, otherCoprocessStack。)
yield
xchg sp, otherCoprocessStack
至于优点,它比定义一个单独的线程并通过某种排队机制与其通信要轻得多。它在迭代复杂的内存结构(如树)时特别有用,因为它避免了手动维护堆栈。