为什么编译器生成的状态机将状态重复恢复为-1?

问题描述 投票:-1回答:1

我正在尝试了解迭代器如何在内部工作,以减轻我对线程安全性的某些担忧。让我们考虑例如以下简单的迭代器:

using System.Collections.Generic;

public class MyClass
{
    public static IEnumerable<int> MyMethod()
    {
        yield return 10;
        yield return 20;
        yield return 30;
    }
}

我可以看到将代码复制粘贴到SharpLab.io之后在后台创建的编译器生成的状态机。这是一个实现接口IEnumerable<int>IEnumerator<int>的类,并且包含以下MoveNext方法:

MoveNext

标识符private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = 10; <>1__state = 1; return true; case 1: <>1__state = -1; <>2__current = 20; <>1__state = 2; return true; case 2: <>1__state = -1; <>2__current = 30; <>1__state = 3; return true; case 3: <>1__state = -1; return false; } } <>1__state是此类的私有字段:

<>2__current

我注意到此代码中的一个模式。首先,private int <>1__state; private int <>2__current; 字段的值恢复为-1,然后将<>1__state分配给下一个迭代值,然后将<>2__current推进到下一个状态。我的问题是:<>1__state行的目的是什么?我编译了这段代码(在痛苦地重命名了所有非法标识符之后)并确认可以注释掉这一行而不会影响该类的功能。我不相信C#编译器团队会忘记这条看起来毫无意义的代码。当然,它的存在必定有一个目的,我想知道这个目的是什么。

c# compilation iterator state-machine
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.