【问题标题】:Is 'yield' keyword a syntactic sugar ? What is its Implementation [duplicate]'yield' 关键字是语法糖吗?它的实现是什么[重复]
【发布时间】:2012-01-07 07:16:36
【问题描述】:

可能重复:
yield statement implementation

我见过msdn docs,上面写着:

yield 关键字向编译器发出信号,表明它出现的方法是一个迭代器块。编译器生成一个类来实现迭代器块中表达的行为。在迭代器块中,yield 关键字与 return 关键字一起使用,为枚举器对象提供值。

所以这意味着 yield 关键字是一种语法糖,编译器负责生成迭代器的繁重工作。 (我说的对吗?)

那么这个语法糖生成的实现代码是什么。

【问题讨论】:

  • 99% 的编程语言都是语法糖。毕竟有Turing Completeness 的概念,并且有一种语言的单条指令已被证明是Turing Complete。在编程语言中,一切都与语法有关。
  • @Stilgar +1 哈哈很好的评论 :) 很难确定它的正确性。
  • 仅作记录:Syntactic suger is a Good Thing™。

标签: c# language-implementation yield-keyword


【解决方案1】:

生成的代码取决于原始代码,但一般来说,会生成一个状态机来跟踪集合的当前状态。

请参阅 Eric Lippert 的 yield statement implementationthis answer 和 Jon Skeet 的 this blog post

【讨论】:

  • thanx.. and +1 for that link to Jon skeet's post
  • 另见Raymond关于该主题的系列文章:blogs.msdn.com/b/oldnewthing/archive/2008/08/12/8849519.aspx
  • @EricLippert 感谢该优秀文章的链接 :)
  • 只是一个简单的问题......为什么不能使用某种堆栈指针来实现迭代器?如果 b 是函数 a() 中的局部变量,并且 a 调用 b 进行迭代,则 b 产生可以简单地跳转到 a 的代码并将堆栈指针移回 a() 首次启动时的位置。如果 a() 将更多的东西压入堆栈,它会在 b 的东西之上。每个函数都必须预先声明变量并保留指向其堆栈的指针,但是当 a() 退出时,它可以弹出所有内容。为什么不呢?
猜你喜欢
  • 2012-01-12
  • 2018-09-15
  • 2011-01-17
  • 2014-09-27
  • 1970-01-01
  • 2013-11-28
  • 2022-11-29
相关资源
最近更新 更多