[筆記] C# 學習筆記 – Lambda 運算式的進階應用

最近接觸了一些 WPF 的項目,遇到跨 Thread 控制UI的時候不能使用 WinForm 的 Invoke ,要使用 WPF 的 Dispatcher 類別的 BeginInvoke,而 BeginInvoke 接受一個方法來進行 UI 的變更,而最簡單的方式就是使用 Lambda 運算式。Google 了一下 Lambda ,發現了不少進階的應用,在這裡跟大家分享一下 + 做筆記 XD

Lambda 是什麼?

Lambda 全名 λ演算 ,是一套用於研究函數定義、函數調用和遞歸的形式系統。

具體是什麼我也不清楚,好像是把數學套用在編程語言上的一個東東。

Lambda wiki : http://zh.wikipedia.org/wiki/%CE%9B%E6%BC%94%E7%AE%97

Lambda 的基本應用 :

BeginInvoke 接受一個 ThreadStart 的委派,而這個委派不像舊版本的 C# 要使用 delegate 關鍵詞,新版的 C# 可以使用 Lanbda 運算式 (=> 運算子) ,效果跟 delegate 一樣。

Lambda 進階 :

Callback :

這裡的 Coding Style 是從 JavaScript 搬過去的吧= = 這裡的邏輯是 : 程式到達 DoSomeStuff 後會先做 DoSomeStuff 裏面的 statement ,然後在清除 TextBox 並設置唯獨屬性的,理論上可以做到 Node 的非同步 IO 的效果吧。

立即執行的函式 :

這是 JavaScript 的例子 :

這是 C# 的實現例子 :

這根本是從 JavaScript 搬過去 C# 的,在函式定義後立即呼叫函式。

以下是配合 await/async 的非同步函式 :

 類別即時初始化 :

在匿名類別裏面定義函式,我也是第一次看這種寫法的,在匿名類別建立後就能立即調用方法,厲害啊…

不過最好的作法是在定義匿名類別前聲明類別的類型,例如 :

也可以使用動態型別 :

 初始化時間分支 :

這種寫法個人認為沒什麼大的優勢,不過在大項目就扮演著重要的角色。

這種寫法直接使用 if…else… 來判斷,並即時定義函式,這樣程式碼就能更易維護,而且更直觀啦。

函式字典 :

這種寫法首先建立一個 Key : String, Value : Action 的字典,然後為字典添加字串和相應的函式,這樣就能直接利用字串提取函式來使用~

 

本文參考 : http://www.codeproject.com/Articles/507985/Way-to-Lambda

並寫下了重點筆記 (其他不寫的是我還在研究,太進階啦= =)