簡體   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