gpt4 book ai didi

c# - 为什么 async 关键字在编译时会生成一个枚举器和附加结构?

转载 作者:可可西里 更新时间:2023-11-01 08:47:51 26 4
gpt4 key购买 nike

如果我创建一个像下面这样的简单类:

public class TestClass
{
public Task TestMethod(int someParameter)
{
return Task.FromResult(someParameter);
}

public async Task TestMethod(bool someParameter)
{
await Task.FromResult(someParameter);
}
}

并在 NDepend 中检查它,它表明 TestMethod采取行动并成为async Task有一个为它生成的结构,带有一个枚举器、枚举器状态机和一些额外的东西。

enter image description here

为什么编译器会生成一个名为 TestClass+<TestMethod>d__0 的结构体?使用异步方法的枚举器?

它生成的 IL 似乎比实际方法生成的要多。在此示例中,编译器为我的类生成 35 行 IL,同时为结构生成 81 行 IL。它还增加了编译代码的复杂性,并导致 NDepend 将其标记为多次违反规则。

最佳答案

async 的原始代码生成与枚举器 block 的代码生成密切相关,因此他们开始在编译器中使用相同的代码来进行这两种代码转换。从那时起它发生了很大的变化,但它仍然保留了原始设计的一些特征(例如名称 MoveNext)。

有关编译器生成的部分的更多信息,Jon Skeet's blog series是最好的来源。

关于c# - 为什么 async 关键字在编译时会生成一个枚举器和附加结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27578507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com