2014-05-09 14 views
8

Hãy nói rằng bạn đã viết một Enumerator tùy chỉnh cho đoạn code dưới đây:Visual Studio đánh giá IEnumerable như thế nào mà không vi phạm vào MoveNext của IEnumerator <T>?

public class School : IEnumerable<Student> 

Và sau đó trong mã khách hàng, bạn đã làm điều này:

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

Sau đó, thiết lập một break-point vào phương pháp MoveNext triển khai lớp học StudentEnumerator của bạn.

Sau đó, khi bạn chạy mã và trình gỡ lỗi ngắt sau khi tạo truy vấn/IEnumerable trong trường hợp này và bạn mở rộng Results View như trong hình bên dưới, Visual Studio đánh giá chuỗi như thế nào mà không vi phạm vào số MoveNext của điều tra viên?

Tôi luôn tò mò về điều này.

enter image description here

+1

Tra cứu FuncEval. Tính năng tuyệt vời với rất nhiều cảnh báo. Xem http://blogs.msdn.com/b/jmstall/archive/2005/03/23/400794.aspx –

+0

Tuyệt vời. Vui lòng thêm câu trả lời này làm câu trả lời. Tôi sẽ đánh dấu nó là đúng. –

Trả lời

7

Visual Studio sử dụng tính năng được gọi là FuncEval, cơ bản cho phép IDE chạy mã của bạn. Điều này cho phép nhiều tính năng đẹp, nhưng rõ ràng là có numerous caveats làm như vậy. Ví dụ là các tác dụng phụ trên các thuộc tính, deadlocks, bỏ qua các bước trong một vòng lặp và các trải nghiệm gỡ lỗi lạ.

3

Điều này là do debugger chỉ gắn liền với quá trình hoạt động của bạn không visual studio riêng của mình. Nếu bạn đã mở một bản sao thứ 2 của studio trực quan, đính kèm một trình gỡ lỗi vào bản sao đầu tiên của studio trực quan, sau đó đặt một điểm ngắt bên trong mã trong bản sao thứ 2 mà điểm ngắt sẽ bị trúng khi bạn đánh giá danh sách trong bản sao đầu tiên của studio trực quan (và bản sao đầu tiên của studio trực quan sẽ treo cho đến khi bạn nhấn tiếp tục trên bản sao thứ 2).

CHỈNH SỬA: Nhờ Brian's link, cách thực hiện việc này là qua FuncEval.

+0

Cảm ơn rất nhiều, Scott. –

Các vấn đề liên quan