2012-10-22 27 views
5

Trạng thái nào được lưu giữa các truy vấn tìm kiếm lại trong Linqpad? Tôi cho là không, vì vậy nếu bạn chạy một kịch bản hai lần nó sẽ có kết quả tương tự cả thời gian.Trạng thái nào được lưu giữa các truy vấn tìm kiếm lại trong Linqpad?

Tuy nhiên, hãy chạy Chương trình C# bên dưới hai lần trong cùng một tab Linqpad. Bạn sẽ tìm thấy đầu tiên nó in một danh sách trống, lần thứ hai một danh sách với thông điệp 'hey'. Chuyện gì vậy?


System.ComponentModel.TypeDescriptor.GetAttributes(typeof(String)).OfType<ObsoleteAttribute>().Dump(); 
System.ComponentModel.TypeDescriptor.AddAttributes(typeof(String),new ObsoleteAttribute("hey")); 

Trả lời

10

LINQPad lưu trữ các miền ứng dụng giữa các truy vấn, trừ khi bạn yêu cầu khác trong Edit | Tuỳ chọn (hoặc nhấn Ctrl + Shift + F5 để xóa miền ứng dụng). Điều này có nghĩa là bất cứ thứ gì được lưu trữ trong các biến tĩnh sẽ được giữ nguyên giữa các truy vấn, giả sử các kiểu giống hệt nhau về số. Đây là lý do tại sao bạn thấy thuộc tính mô tả loại bổ sung trong mã của mình và cũng giải thích lý do tại sao bạn thường thấy lợi thế hiệu suất khi chạy truy vấn tiếp theo (vì nhiều thứ được lưu trong bộ nhớ cache theo cách này hay cách khác trong biến tĩnh).

Bạn có thể tận dụng điều này một cách rõ ràng với phương pháp mở rộng bộ nhớ cache LINQPad của:

var query = <someLongRunningQuery>.Cache(); 
query.Select (x => x.Name).Dump(); 

Cache() là một phương pháp mở rộng trong suốt trả về chính xác những gì nó được ăn nếu đầu vào không phải là đã nhìn thấy trong một truy vấn trước đó . Nếu không, nó trả về kết quả được liệt kê từ truy vấn trước đó.

Do đó nếu bạn thay đổi dòng thứ hai và thực hiện lại truy vấn, truy vấn sẽ thực thi nhanh chóng vì sẽ được cung cấp từ bộ nhớ cache thay vì phải thực thi lại.

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