2012-10-22 2 views
5

Linqpad에서 다시 실행되는 쿼리 간에는 어떤 상태가 저장됩니까? 나는 아무 것도 추정하지 않았습니다. 따라서 스크립트를 두 번 실행하면 두 번에 같은 결과가 나타납니다.Linqpad에서 재실행 쿼리간에 저장된 상태는 무엇입니까?

그러나 동일한 Linqpad 탭에서 아래의 C# 프로그램을 두 번 실행하십시오. 처음에는 빈 목록을 인쇄하고 두 번째는 '안녕하세요'라는 메시지가있는 목록을 찾습니다. 무슨 일이야? | 당신이 편집에 달리 요청하지 않는 한


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

답변

10

LINQPad는 쿼리의 응용 프로그램 도메인을 캐시 환경 설정 (또는 Ctrl + Shift + F5를 눌러 앱 도메인을 지우십시오). 즉, 유형이 수치 적으로 동일하다고 가정 할 때 정적 변수에 저장된 내용은 모두 쿼리간에 보존됩니다. 따라서 코드에 추가 유형 설명 속성이 표시되는 이유와 이후의 쿼리 실행에서 성능 이점이 나타나는 이유를 설명합니다 (많은 것들이 정적 변수에서 한 방향 또는 다른 방식으로 캐시되기 때문에).

당신은 명시 적으로 LINQPad의 캐시 확장 방법이 활용할 수 있습니다

:

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

캐시() 입력이 이미 이전 쿼리에서 볼 수없는 경우가 공급하고 정확하게 반환하는 투명 확장 방법 . 그렇지 않으면 이전 쿼리에서 열거 된 결과를 반환합니다.

따라서 두 번째 줄을 변경하고 쿼리를 다시 실행하면 쿼리를 다시 실행하지 않아도 캐시에서 제공되므로 신속하게 실행됩니다.