繁体   English   中英

C# Lamda 表达式和局部 Function 理解

[英]C# Lamda Expression and Local Function Uderstanding

我有我目前正在使用的这个 C# 代码片段。

 async Task<string> lol() =>  "sample string"; 
 var val = await lol();    
 Console.WriteLine(val);

有人请描述

  • 2号线是什么意思

我无法理解这是本地 function

因此,您熟悉方法 - 您可能已经编写了数百个方法:

public string GreetMe(DateTime d){
  if(d.Hour < 12)
    return "good morning";
  else
    return "good afternoon";
}

您可能熟悉表达式体方法; 它们是解析为值的单行代码。 他们让我们跳过写return{ }

public string GreetMe(DateTime d) => d.Hour < 12 ? "good morning" : "good afternoon";

您可能熟悉 lambda:

listOfTimes.Select(t => t.Hour < 12 ? "good morning" : "good afternoon");
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                   lambda's like a mini method, just the logic; the compiler
                   supplies all the other fluff about types and return keywords

您可能不知道您可以将 lambda (或普通方法,甚至)存储在变量中,然后可以将其传递到将运行它的某个地方。 您可能还会看到“委托”一词用于指代包含方法的变量:

Func<DateTime, string> deleg = t => t.Hour < 12 ? "good morning" : "good afternoon";
listOfTimes.Select(deleg);

或者你可以自己运行它:

string greeting = deleg(DateTime.Now);

局部函数有点像 lambda,因为它们体现了某种方法的逻辑,但它们并不表现为可以传递的东西——这意味着它们在某些情况下的性能略高一些,因为它们不代表任何需要被垃圾收集的东西

public void SomeMethod(){

  //using an expression body
  string greetMe1(DateTime d) => DateTime.Now.Hour < 12 ? "good morning" : "good afternoon";

  //using a normal body
  string greetMe2(DateTime d) {
    if(d.Hour < 12)
      return "good morning";
    else
      return "good afternoon";
  }

  //run the local function, and capture its output
  var greeting = greetMe1(DateTime.Now);
}

简而言之,本地函数是另一种创建可执行代码单元的方法,您可能希望经常调用它,作为更大工作项的一部分。 您可能正在寻找一种重用代码的方法,或者使用大量复杂的嵌套代码来降低一些大型 LINQ 语句的视觉复杂性。 它们就像其他方法一样,但仅限于定义它们的方法。 他们还可以做一些委托不能做的事情,比如调用自己或使用yield ,你可能要小心你声明它们的地方,因为你可以在方法的末尾声明它们并在它们“之前”使用它们重新声明(视觉上),这与典型的 C# 流程略有不同。

async Task<string> lol() =>  "sample string"; 

这一行是任务,它的名字是lol,它返回

 var val = await lol();

在这种情况下,这一行获取lol()的结果“示例字符串”并将其分配给值 val

它通过lol()而不是lol调用的原因是这定义了它是一个任务/函数,并且还允许您将变量发送到任务/函数

一个例子是lol("New String")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM