2014-05-09 72 views
8

比方说,你写了下面的代码自定义枚举:Visual Studio如何评估IEnumerable而不破入其IEnumerator <T>的MoveNext?

public class School : IEnumerable<Student> 

然后在客户端代码,你这样做:

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" } 
    }; 
} 

然后,设置在MoveNext方法的突破点执行你的StudentEnumerator类。

然后,当你运行代码,构建查询/ IEnumerable的在这种情况下,后中断调试,并展开在图片中Results View如下图所示,如何Visual Studio的评估没有闯入其枚举的MoveNext的顺序?

我一直对此很好奇。

enter image description here

+1

查找FuncEval。不错的功能有很多警告。见http://blogs.msdn.com/b/jmstall/archive/2005/03/23/400794.aspx –

+0

太棒了。请添加此作为答案。我会将其标记为正确的。 –

回答

7

Visual Studio使用一个名为FuncEval的功能,它基本上让IDE运行您的代码。这使得很多漂亮的功能,但显然这样做有numerous caveats。例子是对属性,死锁,跳过循环中的步骤和奇怪的调试体验的副作用。

3

这是因为调试器仅连接到正在运行的进程不是视觉工作室本身。如果你打开了visual studio的第二个副本,将一个调试器附加到visual studio的第一个副本,然后在第二个副本中的代码中放置一个断点,当你在第一个visual studio副本中评估列表时,并且视觉工作室的第一个副本将会挂起,直到你在第二个副本上继续)。

编辑:由于Brian's link,这样做的方式是通过FuncEval

+0

非常感谢Scott。 –

相关问题