我怎么能看到C#"语法糖"在幕后真正做了什么?例如,我知道C#lock语句已预编译为:
var temp = obj; Monitor.Enter(temp); try { // body } finally { Monitor.Exit(temp); }
我知道如果你直接在类中声明并初始化实例字段(而不是在构造函数中),那么它是用于在类中声明这些字段并在构造函数中初始化它们的语法糖.
我的问题是,如果我使用这些语法糖编写代码,我怎么能看到生成的C#代码是什么?
是否存在"预编译"过程,首先将这些语法糖转换为更复杂的C#代码,然后将其编译为CIL?
我知道C#lock语句已经预编译为......
不,你不知道,因为那是假的.首先,因为它不再是为锁生成的代码,而且自2009年以来就没有,其次,因为C#规范并没有说编译器需要生成该代码并进行编译.它说编译器需要生成在语义上等同于给定代码的代码.
我的问题是,如果我使用这些语法糖编写代码,我怎么能看到生成的C#代码是什么?
我写了许多用于完成这些转换的语义分析器.没有这样的"生成"代码.在语义分析传递运行时,编译器不能在文本级别上工作.它适用于代表代码的内部数据结构,并对其进行转换.
是否存在"预编译"过程,首先将这些语法糖转换为更复杂的C#代码,然后将其编译为CIL?
不是你感兴趣的水平,没有.
我怎么能看到C#"语法糖"在幕后真正做了什么?
从github获取Roslyn源代码,仔细检查其中包含"降低"一词的任何内容.这就是你感兴趣的魔法发生的地方.("降低"意味着从高级构造开始,比如可以为空的整数加法,并将其重写为一系列低级操作,比如调用HasValue,等等.)我可能会建议您特别关注可空算术降级,用户定义的转换降低和LINQ表达式降低,因为这些降低通过有许多有趣的问题需要解决.
您可能也对我在相关主题上撰写的文章感兴趣:http://ericlippert.com/2014/04/28/lowering-in-language-design-part-one/