Visual Studio如何在不侵入其IEnumerator <T>的MoveNext的情况下评估IEnumerable?

Wat*_* v2 8 c# linq ienumerator enumerator visual-studio

假设你为下面的代码编写了一个自定义枚举器:

public class School : IEnumerable<Student>
Run Code Online (Sandbox Code Playgroud)

然后在客户端代码中,您执行了以下操作:

static void Main(string[] args)
{
    var school = CreateSchoolWithStudents();

    var query = from student in school
                where student.Name.StartsWith("S")
                select student;

    Debugger.Break();
}

private static School CreateSchoolWithStudents()
{
    return new School
    {
        new Student { Name = "Sathyaish" },
        new Student { Name = "John" },
        new Student { Name = "Carol" },
        new Student { Name = "Peter" }
    };
}
Run Code Online (Sandbox Code Playgroud)

然后,在类的MoveNext方法实现上设置一个断点StudentEnumerator.

然后,当您运行代码并且在构造查询/ IEnumerable之后调试器中断,并且您Results View在下面显示的图片中展开了类似内容时,Visual Studio如何评估序列而不会破坏其枚举器MoveNext

我一直很好奇这个.

在此输入图像描述

Bri*_*sen 7

Visual Studio使用一个名为FuncEval的功能,它基本上允许IDE运行您的代码.这可以实现许多不错的功能,但显然有许多注意事项.示例是对属性的副作用,死锁,循环中的跳过步骤以及奇怪的调试体验.