2012-10-22 5 views
5

Quale stato viene salvato tra rieseguire le query in Linqpad? Presumo nessuno, quindi se si esegue una sceneggiatura due volte avrà gli stessi risultati entrambe le volte.Quale stato viene salvato tra rieseguire le query in Linqpad?

Tuttavia, eseguire il programma C# sotto due volte nella stessa scheda Linqpad. Troverete il primo che stampa una lista vuota, la seconda volta una lista con il messaggio 'hey'. Cosa sta succedendo?


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

risposta

10

LINQPad memorizza nella cache il dominio di applicazione tra le query, a meno che non si richiede tuttavia in Modifica | Preferenze (o premi Ctrl + Maiusc + F5 per cancellare il dominio dell'app). Ciò significa che qualsiasi cosa memorizzata in variabili statiche verrà conservata tra le query, assumendo che i tipi siano numericamente identici. Questo è il motivo per cui stai vedendo l'attributo di descrizione del tipo aggiuntivo nel tuo codice e spiega anche perché vedi spesso un vantaggio in termini di prestazioni nelle successive esecuzioni di query (poiché molte cose sono memorizzate in cache in un modo o nell'altro in variabili statiche).

Si può sfruttare questa esplicitamente metodo di estensione Cache LINQPad:

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

Cache() è un metodo di estensione trasparente che restituisce esattamente ciò che è stato alimentato se l'ingresso non era già visto in una query precedente . In caso contrario, restituisce il risultato enumerato dalla query precedente.

Di conseguenza, se si modifica la seconda riga e si esegue nuovamente la query, la query verrà eseguita rapidamente poiché verrà fornita da una cache anziché dover essere eseguita nuovamente.