5

Linqpadでクエリを再実行する間、どの状態が保存されますか? 何もないと仮定したので、スクリプトを 2 回実行すると、どちらも同じ結果になります。

ただし、同じ Linqpad タブで以下の C# プログラムを 2 回実行します。最初は空のリストが表示され、2 回目はメッセージ 'hey' を含むリストが表示されます。どうしたの?


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

1 に答える 1

12

LINQPad は、[編集] | [編集] で別途要求しない限り、クエリ間でアプリケーション ドメインをキャッシュします。設定 (または Ctrl+Shift+F5 を押してアプリ ドメインをクリアします)。これは、型が数値的に同一であると仮定すると、静的変数に格納されているものはすべてクエリ間で保持されることを意味します。これが、コードに追加の型記述属性が表示される理由であり、後続のクエリ実行でパフォーマンスの利点がしばしば見られる理由も説明しています (多くのものが何らかの方法で静的変数にキャッシュされるため)。

LINQPad の Cache 拡張メソッドを使用して、これを明示的に利用できます。

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

Cache() は透過的な拡張メソッドであり、前のクエリで入力がまだ表示されていない場合に、フィードされたものを正確に返します。それ以外の場合は、前のクエリから列挙された結果を返します。

したがって、2 行目を変更してクエリを再実行すると、再実行する代わりにキャッシュから提供されるため、クエリはすばやく実行されます。

于 2012-10-26T14:35:54.173 に答える