让我们考虑一下这个非常简单的异步方法:
static async Task myMethodAsync()
{
await Task.Delay(500);
}
当我用VS2013(前Roslyn编译器)编译时,生成的状态机是一个 struct .
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
当我用VS2015(Roslyn)编译它时,生成的代码如下:
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
正如你所见,Roslyn生成了一个类(而不是 struct ).如果我没记错的话,在旧编译器(我猜是CTP2012)中,async/await支持的第一个实现也生成了类,然后出于性能原因,它被更改为struct.(在某些情况下,可以完全避免装箱和堆分配…(参见this)
有人知道为什么罗斯林的情况又变了吗?(我对此没有任何问题,我知道这个更改是透明的,不会改变任何代码的行为,我只是好奇)
Edit:个
来自@Damien_The_unsiver(以及源代码:)的答案解释了一切.所描述的Roslyn行为仅适用于调试构建(由于注释中提到的CLR限制,这是必需的).在发行版中,它还会生成一个 struct (具有所有这些优点).因此,这似乎是一个非常聪明的解决方案,可以支持编辑和继续,并在生产中获得更好的性能.有趣的东西,感谢所有参与的人!