linqpad - 在 Linqpad 中重新运行查询之间会保存什么状态?

标签 linqpad

在 Linqpad 中重新运行查询之间会保存什么状态?我假设没有,所以如果你运行一个脚本两次,它两次都会有相同的结果。

但是,在同一个 Linqpad 选项卡中运行下面的 C# 程序两次。你会发现第一个它打印一个空列表,第二个打印一个带有“嘿”消息的列表。这是怎么回事?

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

最佳答案

LINQPad 在查询之间缓存应用程序域,除非您在 Edit |首选项(或按 Ctrl+Shift+F5 清除应用程序域)。这意味着存储在静态变量中的任何内容都将在查询之间保留,假设类型在数字上相同。这就是您在代码中看到附加类型描述属性的原因,也解释了为什么您经常在后续查询运行中看到性能优势(因为许多内容以一种或另一种方式缓存在静态变量中)。

您可以通过 LINQPad 的 Cache 扩展方法显式地利用这一点:

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

Cache() 是一个透明的扩展方法,如果输入在之前的查询中没有看到,它会准确地返回它所提供的内容。否则,它返回前一个查询的枚举结果。

因此,如果您更改第二行并重新执行查询,则查询将快速执行,因为将从缓存中提供,而不必重新执行。

关于linqpad - 在 Linqpad 中重新运行查询之间会保存什么状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13010210/

相关文章:

vb.net - 将方法应用于文字

c# - 对 varchar 字段的 linq 查询不返回任何结果

c# - LinqPad动态sql及显示结果

dynamics-crm-2011 - 如何连接到 CRM Dynamics Online Odata 端点 LinqPad?

linq - 使用 IQ 驱动程序在 LINQPAD 中查询多个 Oracle 模式

c# - 将 `string[] args` 提供给 Linqpad 脚本

c# - 如何在 Linqpad 中启用 ASP.NET 角色管理器?

c# - LINQPad索引超出范围异常

c# - CancellationTokenSource.CancelAfter 不工作

.net - 如何在 LINQPad 中使用 Akavache?