我注意到在 Linq 表达式中添加
static
关键字是有效的。
但是它不会生成任何不同的代码。
示例:
list.Select(static model => model.Age).ToList();
list.Where(static model => model.Age > 18).ToList();
在此上下文中
static
关键字的用途是什么?
根据sharplab生成代码:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
public class Class
{
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static Func<Model, bool> <>9__2_0;
public static Func<Model, bool> <>9__2_1;
internal bool <A>b__2_0(Model model)
{
return model.Age > 10;
}
internal bool <A>b__2_1(Model model)
{
return model.Age > 10;
}
}
private List<Model> list = new List<Model>();
public Class()
{
List<Model> obj = list;
Model model = new Model();
model.Age = 10;
obj.Add(model);
}
public void A()
{
List<Model> value = Enumerable.ToList(Enumerable.Where(list, <>c.<>9__2_0 ?? (<>c.<>9__2_0 = new Func<Model, bool>(<>c.<>9.<A>b__2_0))));
List<Model> value2 = Enumerable.ToList(Enumerable.Where(list, <>c.<>9__2_1 ?? (<>c.<>9__2_1 = new Func<Model, bool>(<>c.<>9.<A>b__2_1))));
Console.WriteLine(value);
Console.WriteLine(value2);
}
}
public class Model
{
public int Age;
}
方法允许本地内部方法,这些方法通常用作帮助程序将工作包装在单独的块中。它们也可以标记为静态,这意味着辅助方法将无法访问外部封闭方法内的局部变量或参数。因此,当您使用以下枚举表达式时:
list.Select(model => model.Age)
块
model => model.Age
是一个 lambda 表达式,表示类似于本地帮助器方法的东西。 static 关键字,类似于它在本地方法或函数中的用法,意味着该表达式无法访问在其自身外部声明的变量、参数或任何非静态(或常量)值。
例如,以下代码将无法编译:
int dummy = 0;
list.Select(static model =>
{
dummy++; // CS8820: A static anonymous function cannot contains ref[...]
return model.Age;
})
这是正确的:lambda 中的
static
关键字对 IL 或 JIT 编译的代码没有影响。其目的是确保/确保您不会意外创建闭包。
我仍然使用它,因为它可以快速告诉我哪些 Linq 表达式正在创建闭包,哪些没有,因为我对性能非常着迷。