2012-10-22 62 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(); 

緩存()是返回如果輸入是不是已經在前面查詢看到的正是它餵食透明的擴展方法。否則,它將返回前一個查詢的枚舉結果。

因此,如果您更改第二行和重新執行查詢,查詢將迅速執行,因爲會從緩存中提供,而不必重新執行。

相關問題