淺入淺出Lambda表達式

来源:http://www.cnblogs.com/ldyblogs/archive/2017/09/04/lambda.html
-Advertisement-
Play Games

大家在開發中會經常看到也會經常使用lambda表達式。 園子里也有很多詳解lambda表達式的文章,多是從橫向來講述。 但lambda表達式到底如何變成現在這個樣子,表達式的形式到底代表什麼含義,這些可能就不太明白了。 本文將從來源開始,縱向剖析,一直演化出我們常用的lambda表達式。 引子 為方 ...


大家在開發中會經常看到也會經常使用lambda表達式。

園子里也有很多詳解lambda表達式的文章,多是從橫向來講述。

但lambda表達式到底如何變成現在這個樣子,表達式的形式到底代表什麼含義,這些可能就不太明白了。

本文將從來源開始,縱向剖析,一直演化出我們常用的lambda表達式。

 

引子

為方便說明,先舉個例子,列出Lambda表達式的一個典型形式:

x=>x+1

 

大家可以看到,Lambda表達式的語法由三部分組成,分別為:

1. Lambda運算符 => 讀作goes to;

2. 左邊參數部分 x ;

3. 右邊的Lambda主體

 

可以看出,其實所謂的Lambda表達式(lambda expression)就是一個匿名函數,或者說是匿名函數的簡單形式。而匿名函數的作用就是分配給委托類型的。

 

假設我們聲明一個委托:

delegate int Mydel(int x);

 

lambada 表達式(匿名函數)用來填充委托變數:

Mydel del= x=>x+1;

 

我們就從這個例子說開去。

 

演化過程

剛剛說過,lambda表達式就是匿名方法的簡寫形式,說到lambda表達式就要說到匿名方法,而匿名方法就是初始化委托時內聯聲明的方法。

因此我們先從委托說起,一直推導出 lambda表達式Mydel del=x=>x+1; 的形式。

 

和類相似,委托是用戶自定義的引用類型。

類表示的是數據和方法的集合,而委托則持有一個或多個方法,以及一系列預定義操作。

 

可以將委托類比為類,創建和使用的過程如下:

1.聲明類型

2.聲明類型的變數

3.填充變數

4.使用變數

 

對應著四步的完整例子:

delegate int Mydel(int x);

Mydel del;

del=new Mydel(xxx方法); //也可以直接用簡化寫法 del=xxx方法;

del(2);

 

以上第三步中初始化委托使用 xxx方法 。

如果方法專門用來初始化委托,只會被使用一次,這種情況下,除了創建委托的語法需要,沒有必要創建獨立的具名方法,這樣就引出了匿名方法。

匿名方法是在初始化委托時內聯聲明的方法,非匿名方法的例子如下:

public static int Add1(int x)

{

    return x+1 ;

}

delegate int MyDel(int x);

調用:

MyDel del=Add1;

del(2);

 

改造成用匿名方法的完整例子:

delegte int MyDel(int x);

調用:

MyDel del=delegate(int x) { return x+1;}

del(2);

 

從例子中提取出匿名方法的語法:

delegate(Parameters) { ImplementationCode }

幾個註意點:

1. 返回值:不顯示聲明返回值,與委托相同

2. 參數

以下情況可以使用圓括弧為空或省略圓括弧來簡化參數列表。

a. 不包括任何out 參數 b. 不使用任何參數

滿足上面兩個條件即可省略參數列表,例子:

delegate int SomeDel();

SomeDel sDel = delegate { return 1; };

3.params 參數

如果委托聲明的參數列表包含了 params 參數(可變數目參數),匿名方法的參數列表將忽略params關鍵字

delegate void SomeDel(int x, params int[] y);

SomeDel sDel = delegate(int x, int[] y) { … }

 

匿名方法準備好了,我們稍加變化,就可以得出Lambda表達式

 

以 MyDel del=delegate(int x) { return x+1;} 為例。

轉換步驟:

1.刪除delegate關鍵字,在參數列表和匿名方法主體之間放 =>

MyDel del = (int x) => {return x+1; } ;

可以進一步簡化

2. 去掉參數類型

MyDel del2 = (x) => {return x+1; } ;

說明:

編譯器可以從委托聲明中知道委托參數的類型,因此可以省略類型。

帶有類型的參數列表稱為顯式類型。

省略類型的參數列表稱為隱式類型。

3.去掉參數刮號

MyDel del3 = x => {return x+1; } ;

說明:

如果只有一個隱式類型參數,可以省略刮號。

4.去掉主體的大刮號及return

MyDel del4 = x=> x+1;

說明:

Lambda表達式允許表達式的主體是語句塊或表達式。

如果語句塊包含一個返回語句,可以將語句塊替換成return 後面的表達式。

 

這樣就得到我們文章開頭的形式。

 

總結

C#2.0引入了匿名方法,C#3.0引入了lambda表達式,可以看到,lambda表達式簡化了匿名函數的使用,讓代碼更加簡潔。

理解了這篇文章,相信大家對lambda表達式就會有一個整體的把握,再學具體用法時思路會很清晰。

祝學習進步~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Android開發中難免會遇到大量的數據載入到ListView中進行顯示, 然後其中最重要的數據傳遞橋梁Adapter適配器是常用的,隨著市場的需 求變化ListView'條目中的內容是越來越多這就需要程式員來自定義適配器, 而關鍵的就是適配器的優化問題,適配器沒有優化好往往就會造成OOM (記憶體 ...
  • 本文主要介紹json最原始的解析與google提供的gson工具類解析 ①json解析 ②gson解析 1)首先在AndroidStudio中安裝一個GsonFormat插件 2)新建一個javaben類然後按下組合鍵alt+insert 把完整的json數據拷貝到編輯框中 3)添加gson的依賴包 ...
  • Android的版本有很多通常開發的時候對話框大多數使用自定義或是 Google提供的V4, V7 相容包來開發保持各個版本的對話框樣式統一,所以這裡使用的是V7 包里的AlertDialog。 ...
  • 中文翻譯文檔: http://blog.csdn.net/rickiyeat/article/details/56483577 版本說明: Jquery v2.1.1 Bootstrap V3.3.7 bootstrap-table V1.11.1 一、視圖頁 1 <!DOCTYPE html> 2 ...
  • C#中Cookies的讀取 鏈接: 一 、寫入Cookie 1. Name 和 Value 屬性由程式設定,預設值都是空引用。 2. Domain屬性的預設值為當前URL的功能變數名稱部分,不管發出這個cookie的頁面在哪個目錄下的。 例如, http://www.kent.com/application ...
  • Cookie客戶端緩存。 1、引言 隨著瀏覽器的處理能力不斷增強,越來越多的網站開始考慮將數據存儲在「客戶端」,那麼久不得不談本地存儲了。 本地存儲的好處: 一是避免取回數據前頁面一片空白,如果不需要最新數據也可以減少向伺服器的請求次數,從而減少用戶等待從服務端獲取數據的時間。 二是網路狀態不佳時仍 ...
  • 本文是要寫的下篇《C#反射及優化用法》的前奏,不能算是下一篇文章的基礎的基礎吧,有興趣的朋友可以關註一下。 隨著C#的發展,該語言內容不斷豐富,開發變得更加方便快捷,C# 的鋒利盡顯無疑。C# 語言從誕生起就是強類型語言,這一性質到今天不曾改變,我想以後也不會變。既然是強類型語言,那編寫任一程式均要 ...
  • 獲取電腦內部信息 - ComputerInfoHelper 一、代碼 ComputerInfoHelper.cs ManagementBaseObjectPropertyName.cs WmiPath.cs 二、測試 1.電腦硬碟信息 2.我的電腦中的硬碟信息 3.測試代碼 4.輸出結果: 所有硬 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...