我最近遇到了这种语法:
var projection = myCollection.Select(static f => f.MyProperty);
这是我第一次在Select语句中看到这static
个谓词语法.
也就是说,我还没有找到任何关于这种方法的优点/缺点的可靠文档.有人能启发我吗?
谢谢
我最近遇到了这种语法:
var projection = myCollection.Select(static f => f.MyProperty);
这是我第一次在Select语句中看到这static
个谓词语法.
也就是说,我还没有找到任何关于这种方法的优点/缺点的可靠文档.有人能启发我吗?
谢谢
根据C#文件,
从C#9.0开始,可以将静态修饰符应用于lambda表达式,以防止lambda无意中捕获局部变量或实例状态
在其他新闻中,它只是阻止您访问lambda在(this
和base
)中定义的对象
例如,这是合法的:
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 |
No difference in performance (mean differences are within stderror!),reducing GC pressure.没有伤害,没有犯规!如果您的代码是高度面向对象的,我建议您使用此选项,以避免通过行为不端的lambda挂起"死"对象.