相关疑难解决方法(0)

为什么Roslyn中的异步状态机类(而不是结构)?

让我们考虑一下这个非常简单的异步方法:

static async Task myMethodAsync() 
{
    await Task.Delay(500);
}
Run Code Online (Sandbox Code Playgroud)

当我用VS2013(前Roslyn编译器)编译它时,生成的状态机是一个结构.

private struct <myMethodAsync>d__0 : IAsyncStateMachine
{  
    ...
    void IAsyncStateMachine.MoveNext()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用VS2015(Roslyn)编译它时生成的代码是这样的:

private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
    ...
    void IAsyncStateMachine.MoveNext()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,Roslyn生成一个类(而不是结构).如果我没记错的话,旧编译器中的async/await支持的第一个实现(我认为是CTP2012)也生成了类,然后由于性能原因将其更改为struct.(在某些情况下,你可以完全避免拳击和堆分配......)(见这个)

有谁知道为什么罗斯林再次改变了这一点?(我对此没有任何问题,我知道这个改变是透明的,不会改变任何代码的行为,我只是好奇)

编辑:

来自@Damien_The_Unbeliever(以及源代码:))imho的答案解释了一切.描述的Roslyn行为仅适用于调试版本(由于注释中提到的CLR限制,这是必需的).在Release中它还生成一个结构(具有该​​...的所有好处).所以这似乎是一个非常聪明的解决方案,支持编辑和继续以及更好的生产性能.有趣的东西,感谢所有参与的人!

.net c# language-lawyer roslyn

86
推荐指数
2
解决办法
3170
查看次数

标签 统计

.net ×1

c# ×1

language-lawyer ×1

roslyn ×1