最近和一位同事說下Linq,我提到Linq裡很多方法表面來看是把原先不怎麼常用的一種技巧正式化了下,就是把函數當參數傳遞,同事有點不理解,或者這樣說,在工作中這有什麼用處.
我這裡給出二種簡單比較常用的用法.
1.填充多Execl去重複代碼.
這裡想法比較簡單,也很容易想到,我有時匯出幾份Execl時,那麼相應的就會有開啟Execl,填充Execl,關閉儲存Execl這三步.
但是這幾份Execl裡,開啟Execl,關閉儲存Execl是相同的.我們代碼工人都知道不要寫重複代碼.那麼好,封裝吧.........
但是關鍵是填充Execl這步不一樣,怎麼做(不要告訴我用設計模式來封裝多種模式,然後用不同模式來填充啊.)很簡單,
因為填充Execl不一樣,也就是說,要填充的Execl表格Worksheet不一樣,在這裡就可以把函數當參數傳遞.如下.
public string OnAction(params Action<Worksheet>[] actions)
{
//開啟Execl
for(int i = 0;i < actions.Length;i++)
{
wsheet = myExecl.Worksheets.getItem(i+1);
//在這裡填充相應的Execl表格Worksheet,至於怎麼填充的,就看你相對應的action[i]方法的實現了.
action[i](wsheet);
}
//關閉儲存Execl
}
2.ASP.NET 寫的 泛型委派在項目中的應用.
這裡給我們展示了一種情境.
具體情境:在用戶端調用WCF服務時,我們都需要在客戶做異常處理,最常見的錯誤異常為CommunicationException,TimeoutException,Exception.
通常我們只能執行這個方法,然後捕獲異常.一個二個方法沒什麼.如果到達10個會怎麼樣,還不說100的時候.你的項目裡就全是那些一模一樣的Try{}Catch{}.
幸好,作者給了我們一種處理方法.
把方法作為一個對象來考慮,我只考慮方法執行的異常情況,你怎麼處理我不管.如下.
public static void Invoke<TContract>(TContract proxy, Action<TContract> action)
{
try{
action(proxy));
}
catch()
{
}
catch()
{
}
}
這樣整個世界清靜了.
PS:說實話,理論上的講解很麻煩,我只有更多從執行個體來說.有理解錯誤的地方,大家請指出.謝謝.