LINQ Select 中的 C# 静态关键字,Where,

问题描述 投票:0回答:2

我注意到在 Linq 表达式中添加

static
关键字是有效的。 但是它不会生成任何不同的代码。

示例:

list.Select(static model => model.Age).ToList();
list.Where(static model => model.Age > 18).ToList();

在此上下文中

static
关键字的用途是什么?

在 Sharplab 上查看生成的代码

根据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;
}
c# linq
2个回答
2
投票

方法允许本地内部方法,这些方法通常用作帮助程序将工作包装在单独的块中。它们也可以标记为静态,这意味着辅助方法将无法访问外部封闭方法内的局部变量或参数。因此,当您使用以下枚举表达式时:

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;
})

0
投票

这是正确的:lambda 中的

static
关键字对 IL 或 JIT 编译的代码没有影响。其目的是确保/确保您不会意外创建闭包。

我仍然使用它,因为它可以快速告诉我哪些 Linq 表达式正在创建闭包,哪些没有,因为我对性能非常着迷。

© www.soinside.com 2019 - 2024. All rights reserved.