ILSpy生成的代码

时间:2018-08-20 16:06:14

标签: c# .net

我试图弄清楚C#中的Tasks是如何工作的。 我找到了这篇文章。

http://foreverframe.net/what-lies-beneath-asyncawait-in-c/

但是,我花了一些时间来寻找某些行的含义,但是什么也没找到。

例如。

        private int <>s__4;

        private int <>s__5;

        private int <>s__6;

“ <>”符号是什么意思?有大量的反编译c#源代码示例,这些代码始终包含诸如“ <> d__0”之类的内容?

我在Google上搜索了IL操作码参考以及ILSpy教程,该教程可以解释这一点,但一无所获。我仍然很好奇对C#中的Task模式的完全理解。

预先感谢您提供此示例的帮助,或为我提供适当的文档/参考。

1 个答案:

答案 0 :(得分:1)

<>字符在C#中是非法的,但在IL中是合法的。

让我解释一下。

当编译器自动生成代码时,例如将yield return的方法转换为状态机,或将async/await的方法转换为类似方法时,编译器通常会构造一个类来承载此转换后的代码

曾经是局部变量的类也被重写为此类中的字段,以便承受通常从方法返回的状态转换。

您看到的字段是那些生成的字段。此处的名称是由编译器选择的,这种方式在IL中是合法的,但在C#中是非法的,这意味着在任何情况下,编译器都不会意外生成您也用于字段或标识符的名称。

就这样,这是合法的字段(IL方面是合法字段,而C#方面是非法名称)。

除了名字,它们只是...字段。