ToB企服应用市场:ToB评测及商务社交产业平台

标题: C# 10 Lambda 语法的改进 [打印本页]

作者: 篮之新喜    时间: 2023-2-3 11:37
标题: C# 10 Lambda 语法的改进
C# 10 包括了对 Lambda 表达式的处理方式的许多改进:
这些功能使 Lambda 表达式更类似于方法和本地函数。 在不声明委托类型的变量的情况下,这些改进使得人们可以更容易使用 Lambda 表达式,并且它们可以与新的 ASP.NET Core 最小 API 更无缝地工作。
首先要介绍的是自动推断委派类型(inferred delegate type)。示例:
  1. Func<string> hello = () => "Hello World";
  2. Console.WriteLine(hello());
复制代码
此示例在C# 9可以通过编译。到了C# 10,则因为编译器能够自动推断委派类型而可以使用var定义委派。
  1. var hello = () => "Hello World"; // C# 9 无法编译!
复制代码
但如果委派的回传值为null,编译器则无法判定你想回传什么类型,例如:
  1. var hello = () => null; // 无法编译!
复制代码
此时如果还是想用var来声明返回类型,则可以在撰写lambda表达式的时候定义返回类型
  1. var hello = string? () => null; // OK!
复制代码
当你的程序有很复杂的嵌套lambda语句,便可使用这种明确声明返回类型的方式来减轻编译器推断类型的负担,从而加快编译速度。这是lambda语法的第二项改进。
第三项改进是当我们把lambda表达式传入某方法的参数时,参数类型可以是object、Delegate、Expression
  1. M1(() => "test"); // Func<string>
  2. M2(() => "test"); // Func<string>
  3. M3(() => "test"); // Expression<Func<string>>
  4. void M1(object x) { }
  5. void M2(Delegate x) { }
  6. void M3(Expression x) { }
复制代码
在C# 9中,第1行至第3行都无法通过编译(无法将lambda表达式转换成目标参数类型),C# 10则没有问题。
最后一项改进是,lambda表达式从现在开始可以套用特征项(attribute),包括匿名方法、方法参数、以及返回值,皆可套用。示例:
  1. var fn1 = [Description("Hello")] () => "Hello";
  2. var fn2 = ([Description("参数") string s) => "Hello " + s;
  3. var fn3 = [Description("Hello")]
  4.           [return: Description("返回字符串")]
  5.           ([Description("参数")] string s) => "Hello " + s;
复制代码
说明:
使用时机:某些API会去判断传入的委托方法是否应用了某些特性而有不同的行为,此时便可使用C# 10新增的lambda特性语法来撰写匿名方法,而不用像以前那样非得撰写具名方法不可。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4