为什么 return 一个 IAsyncEnumerable 异步方法实现为 类 而不是结构?
Why are async methods, which return an IAsyncEnumerable, implemented as classes instead of structs?
我很好奇为什么返回 IAsyncEnumerable
的异步方法会编译成状态机,状态机被定义为 class 而不是通常的结构。请参阅以下示例:
public async IAsyncEnumerable<int> MethodOne()
{
await Task.Delay(10);
yield return 0;
}
// Compiled version
[CompilerGenerated]
private sealed class <MethodOne>d__0 : IAsyncEnumerable<int>, IAsyncEnumerator<int>,
IAsyncDisposable, IValueTaskSource<bool>, IValueTaskSource, IAsyncStateMachine
{
// Omitted for brevity
}
public async Task<int> MethodTwo()
{
await Task.Delay(10);
return 0;
}
// Compiled version
[StructLayout(LayoutKind.Auto)]
[CompilerGenerated]
private struct <MethodTwo>d__0 : IAsyncStateMachine
{
// Omitted for brevity
}
状态机 本身 实现 IAsyncEnumerable<T>
,new
并作为 IAsyncEnumerable<T>
实例返回。如果它是一个结构类型,无论如何它都会被转换为接口类型立即装箱。
您可以将其与为 IEnumerable<T>
生成的状态机进行比较,后者也是 class:
public IEnumerable<int> MethodThree()
{
yield return 0;
}
// Compiled version
[CompilerGenerated]
private sealed class <MethodThree>d__0 : IEnumerable<int>, IEnumerable,
IEnumerator<int>, IDisposable, IEnumerator
{
// Omitted for brevity
}
[IteratorStateMachine(typeof(<MethodThree>d__0))]
public IEnumerable<int> MethodThree()
{
return new <MethodThree>d__0(-2);
}
我很好奇为什么返回 IAsyncEnumerable
的异步方法会编译成状态机,状态机被定义为 class 而不是通常的结构。请参阅以下示例:
public async IAsyncEnumerable<int> MethodOne()
{
await Task.Delay(10);
yield return 0;
}
// Compiled version
[CompilerGenerated]
private sealed class <MethodOne>d__0 : IAsyncEnumerable<int>, IAsyncEnumerator<int>,
IAsyncDisposable, IValueTaskSource<bool>, IValueTaskSource, IAsyncStateMachine
{
// Omitted for brevity
}
public async Task<int> MethodTwo()
{
await Task.Delay(10);
return 0;
}
// Compiled version
[StructLayout(LayoutKind.Auto)]
[CompilerGenerated]
private struct <MethodTwo>d__0 : IAsyncStateMachine
{
// Omitted for brevity
}
状态机 本身 实现 IAsyncEnumerable<T>
,new
并作为 IAsyncEnumerable<T>
实例返回。如果它是一个结构类型,无论如何它都会被转换为接口类型立即装箱。
您可以将其与为 IEnumerable<T>
生成的状态机进行比较,后者也是 class:
public IEnumerable<int> MethodThree()
{
yield return 0;
}
// Compiled version
[CompilerGenerated]
private sealed class <MethodThree>d__0 : IEnumerable<int>, IEnumerable,
IEnumerator<int>, IDisposable, IEnumerator
{
// Omitted for brevity
}
[IteratorStateMachine(typeof(<MethodThree>d__0))]
public IEnumerable<int> MethodThree()
{
return new <MethodThree>d__0(-2);
}