C# 在闭包中是否提升了静态只读值类型?

C# 在闭包中是否提升了静态只读值类型?,c#,closures,C#,Closures,如果我有以下资料: static readonly TimeSpan ExpiredAfter = TimeSpan.FromMilliseconds(60000); foreach (ModuleInfo info in moduleList.Where(i => DateTime.Now - i.LastPulseTime > ExpiredAfter).ToArray()) moduleList.Remove(info); ExpiredAfter是否被解除,或者编

如果我有以下资料:

static readonly TimeSpan ExpiredAfter = TimeSpan.FromMilliseconds(60000);

foreach (ModuleInfo info in moduleList.Where(i => DateTime.Now - i.LastPulseTime > ExpiredAfter).ToArray())
    moduleList.Remove(info);
ExpiredAfter是否被解除,或者编译器是否知道它可以直接访问它?这样写会更有效吗:

static readonly TimeSpan ExpiredAfter = TimeSpan.FromMilliseconds(60000);

static bool HasExpired(ModuleInfo i) { return DateTime.Now - i.LastPulseTime > ExpiredAfter; }

foreach (ModuleInfo info in moduleList.Where(HasExpired).ToArray())
    moduleList.Remove(info);
ExpiredAfter是否被解除,或者编译器是否知道它可以直接访问它

最简单的检查方法是编译代码,然后在Reflector之类的工具中反编译。我希望编译器只生成一个直接访问静态变量的静态方法

这样写会更有效吗:

static readonly TimeSpan ExpiredAfter = TimeSpan.FromMilliseconds(60000);

static bool HasExpired(ModuleInfo i) { return DateTime.Now - i.LastPulseTime > ExpiredAfter; }

foreach (ModuleInfo info in moduleList.Where(HasExpired).ToArray())
    moduleList.Remove(info);
再次,自己测试:)即使这样写效率更高,也不一定是正确的选择。哪个对你来说更容易阅读?这一点点代码对性能有多重要?它已经足够快了吗?

一个静态(或者说,任何)字段都不可能被捕获

从语言规范:

7.15.5外部变量任何局部变量、值参数或参数数组,其范围包括lambda表达式或 匿名方法表达式被称为 匿名函数。在类的实例函数成员中
值被视为值参数,是的外部变量 函数成员中包含的任何匿名函数

7.15.5.1捕获的外部变量当外部变量被匿名函数引用时,称外部变量已被匿名函数捕获

静态字段永远不是局部变量、值参数或参数数组


也就是说,我已经看到编译器无缘无故地捕获了
这个
,但这似乎不是其中之一。我用反编译器验证了在实例和静态封闭方法的情况下,C#4.0编译器为lambda生成的代码与您的“手动”版本几乎相同。。。除了编译器似乎仅在lambda情况下缓存和重用对结果委托的引用(在静态字段中)。这可能会反直觉地使lambda方法比这种情况下的方法组方法更快(并增加更少的内存压力)(通过多次执行封闭方法)!您必须以两种方式对其进行基准测试,以确定是否…

我已经忘记了委托创建,这是一个很棒的答案!我喜欢这是另一种情况,我们应该让编译器思考=)@Tergiver:非常正确。不过,绝对值得进行基准测试,以了解其影响。