回覆列表
  • 1 # 不會抽菸的煙

    匿名函式(Anonymous Function)是表示“內聯”方法定義的表示式。匿名函式本身及其內部沒有值或者型別,但是可以轉換為相容的委託或者表示式樹型別。匿名函式轉換的計算取決於轉換的目標型別:如果是委託型別,則轉換計算為引用匿名函式所定義的方法的委託;如果是表示式樹型別,則轉換將計算以物件結構形式表示方法結構的表示式樹。匿名函式有兩種語法風格:Lambda表示式(lambda-expression)和匿名方法表示式(anonymous-method-expression)。在幾乎所有的情況下,Lambda表示式都比匿名方法表示式更為簡介具有表現力。但現在C#語言中仍保留了後者,為了向後相容。

    Lambda表示式:async可選 (匿名的函式簽名)=> (匿名的函式體)匿名方法表示式:async可選 delegate (顯式的匿名函式簽名) 可選{程式碼塊}其中匿名的函式簽名可以包括兩種,一種是隱式的匿名函式簽名另一種是顯式的匿名函式簽名:隱式的函式簽名:(p)、(p1,p1)顯式的函式簽名:(int p)、(int p1,int p2)、(ref int p1,out int p2)匿名的函式體可以是表示式或者程式碼塊。從上面我們可以看出,Lambda表示式的引數形式可以顯式或者隱式型別化。在顯式型別化引數列表中,每個引數的型別是顯式宣告的,在隱式型別化引數列表中,引數的型別是從匿名函數出現的上下文中推斷出來的。當Lambda表示式只有一個具有隱式型別化引數的時候,引數列表可以省略圓括號,也就是說:(引數) => 表示式可以簡寫為引數 => 表示式一些匿名函式的示例

    x => x + 1 //隱式的型別化,函式體為表示式   x => {return x + 1;} //隱式的型別化,函式體為程式碼塊   (int x) => x + 1 //顯式的型別化,函式體為表示式   (int x) => {return x + 1;} //顯式的型別化,函式體為程式碼塊   (x , y) => x * y //多引數   () => Console.WriteLine() //無引數   async (t1 , t2) => await t1 + await t2 //非同步   delegate (int x) {return x + 1;} //匿名函式方法表示式   delegate {return 1 + 1;} //引數列表省略

    Lambda表示式和匿名方法表示式的區別:當沒有引數的時候,匿名方法表示式允許完全省略引數列表,從而可以轉換為具有任意值引數列表的委託型別,Lambda表示式則不能省略引數列表的圓括號()。Lambda表示式允許省略和推斷型別引數,而匿名方法表示式要求顯式宣告引數型別。Lambda表示式主體可以為表示式或者程式碼塊,而匿名方法表示式的主體必須為程式碼塊。只有Lambda表示式可以相容到表示式樹型別。

  • 2 # 不會抽菸的煙

    匿名函式(Anonymous Function)是表示“內聯”方法定義的表示式。匿名函式本身及其內部沒有值或者型別,但是可以轉換為相容的委託或者表示式樹型別。匿名函式轉換的計算取決於轉換的目標型別:如果是委託型別,則轉換計算為引用匿名函式所定義的方法的委託;如果是表示式樹型別,則轉換將計算以物件結構形式表示方法結構的表示式樹。匿名函式有兩種語法風格:Lambda表示式(lambda-expression)和匿名方法表示式(anonymous-method-expression)。在幾乎所有的情況下,Lambda表示式都比匿名方法表示式更為簡介具有表現力。但現在C#語言中仍保留了後者,為了向後相容。

    Lambda表示式:async可選 (匿名的函式簽名)=> (匿名的函式體)匿名方法表示式:async可選 delegate (顯式的匿名函式簽名) 可選{程式碼塊}其中匿名的函式簽名可以包括兩種,一種是隱式的匿名函式簽名另一種是顯式的匿名函式簽名:隱式的函式簽名:(p)、(p1,p1)顯式的函式簽名:(int p)、(int p1,int p2)、(ref int p1,out int p2)匿名的函式體可以是表示式或者程式碼塊。從上面我們可以看出,Lambda表示式的引數形式可以顯式或者隱式型別化。在顯式型別化引數列表中,每個引數的型別是顯式宣告的,在隱式型別化引數列表中,引數的型別是從匿名函數出現的上下文中推斷出來的。當Lambda表示式只有一個具有隱式型別化引數的時候,引數列表可以省略圓括號,也就是說:(引數) => 表示式可以簡寫為引數 => 表示式一些匿名函式的示例

    x => x + 1 //隱式的型別化,函式體為表示式   x => {return x + 1;} //隱式的型別化,函式體為程式碼塊   (int x) => x + 1 //顯式的型別化,函式體為表示式   (int x) => {return x + 1;} //顯式的型別化,函式體為程式碼塊   (x , y) => x * y //多引數   () => Console.WriteLine() //無引數   async (t1 , t2) => await t1 + await t2 //非同步   delegate (int x) {return x + 1;} //匿名函式方法表示式   delegate {return 1 + 1;} //引數列表省略

    Lambda表示式和匿名方法表示式的區別:當沒有引數的時候,匿名方法表示式允許完全省略引數列表,從而可以轉換為具有任意值引數列表的委託型別,Lambda表示式則不能省略引數列表的圓括號()。Lambda表示式允許省略和推斷型別引數,而匿名方法表示式要求顯式宣告引數型別。Lambda表示式主體可以為表示式或者程式碼塊,而匿名方法表示式的主體必須為程式碼塊。只有Lambda表示式可以相容到表示式樹型別。

  • 中秋節和大豐收的關聯?
  • 紅豆和綠豆的營養價值和功效有什麼區別?