我最近遇到了这种语法:

var projection = myCollection.Select(static f => f.MyProperty);

这是我第一次在Select语句中看到这static个谓词语法.

也就是说,我还没有找到任何关于这种方法的优点/缺点的可靠文档.有人能启发我吗?

谢谢

推荐答案

根据C#文件,

从C#9.0开始,可以将静态修饰符应用于lambda表达式,以防止lambda无意中捕获局部变量或实例状态

在其他新闻中,它只是阻止您访问lambda在(thisbase)中定义的对象

例如,这是合法的:

return Collection.Select(f =>
{
    if (this.Type == "Thing")
        return f.Value;
    return 0;
}).Sum();

这不是:

//                       static declared here...
//                       vvvvvv 
return Collection.Select(static f =>
{
//      ...but this instance is referenced here!
//      vvvv
    if (this.Type == "Thing")
        return f.Value;
    return 0;
}).Sum();

摘要基准

public long Benchmark() => Collection.Select(static f => f.Value).Sum();
Method N Type Mean Error StdDev Median Code Size
NonStatic 1000 Class 21.49 us 1.560 us 4.574 us 18.90 us 2,663 B
Static 1000 Class 20.83 us 1.279 us 3.750 us 19.30 us 2,665 B
NonStatic 1000 Struct 18.63 us 1.274 us 3.756 us 16.20 us 1,734 B
Static 1000 Struct 19.57 us 1.391 us 4.035 us 19.10 us 1,734 B
NonStatic 100000 Class 1,505.53 us 117.721 us 335.865 us 1,495.05 us 1,812 B
Static 100000 Class 1,530.50 us 123.061 us 362.849 us 1,499.05 us 1,711 B
NonStatic 100000 Struct 1,024.84 us 86.955 us 255.023 us 913.40 us 1,410 B
Static 100000 Struct 1,040.97 us 79.565 us 229.563 us 951.30 us 1,309 B

TL;DR:

No difference in performance (mean differences are within stderror!)reducing GC pressure.没有伤害,没有犯规!如果您的代码是高度面向对象的,我建议您使用此选项,以避免通过行为不端的lambda挂起"死"对象.

Csharp相关问答推荐

使用C#中的Shape API从Azure目录获取所有用户

如何在Reflection. Emit中使用具有运行时定义的类型参数的泛型类型

C#DateTime.ToString在ubuntu和centos中返回不同的结果

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

当前的文化决定了错误的文化

持有者安全定义未显示在Swagger.NET 8中

Automapper 12.x将GUID映射到字符串

C#使用TextFieldParser读取.csv,但无法使用";0";替换创建的列表空条目

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

单元测试类型为HttpClient with Microsoft.Extensions.Http.Resilience

如何在mediatr命令中访问HttpContext而不安装弃用的nuget包

用于请求用户返回列表的C#Google API

C#命名管道-编码错误?

如何使用实体框架核心对字符串_agg使用强制转换为varchar(Max)

我应该为C#12中的主构造函数参数创建私有属性吗?

从MudAutoComplete打开对话框,列表仍然可见

C#中COM对象的实际地址

如何在Cake脚本中设置MSBuild.exe的绝对路径

Windows 10上埃及标准时间的时区偏移不正确

C#Web服务转换为 node /Express不工作