程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> [C# 3.0 入門] [第一章 Lambda表達式] 第二節:Lambda表達式帶來了什麼(4)

[C# 3.0 入門] [第一章 Lambda表達式] 第二節:Lambda表達式帶來了什麼(4)

編輯:關於C語言

List 6 List 5中對應的菜單項

可是,這樣的代碼如果要為將來可能需要也可能不需要的變化准備的話,將會變得相當臃腫。本質上完全沒有意義的delegate和return顯得非常刺眼,看上去很難理解意圖。這種代碼就是YAGNI原則所說的那種應該避免的代碼的典型例子。

因此,如果使用C# 2.0,這種code應該就不會被采用。筆者雖然屬於那種對匿名方法使用得揮金如土的類型,在這個case上,(用匿名方法)恐怕優勢要小於劣勢。

然而,下面這並不是匿名方法,打眼一看就是較少的文字就能描述的Lambda表達式。下面的代碼,“()=>true”和“()=>DateTime.Now.Hour > 19”,一看就是Lambda表達式的樣子。

1private static MenuItemC[] MenuItems4 =
2  {
3    new MenuItemC("選擇項1", 執行方法, ()=>true),
4    new MenuItemC("選擇項2", 執行方法, ()=>true),
5    new MenuItemC("選擇項3", 執行方法, ()=>true),
6    new MenuItemC("選擇項4", 執行方法, ()=>DateTime.Now.Hour >= 19),
7  };
8

List 7 對List 6改用Lambda表達式後

說實話,code寫成這樣應該可以通過了。雖然違反了YAGNI的原則,但在不損害code的可理解性的范圍內,對於未知修改來說也是上了保險了。

事實上這個保險也確實起作用。很快,菜單的有效時間從“19點以後”變成“19點後22點前”。來吧,數組做如下修正:

1private static MenuItemC[] MenuItems5 =
2  {
3    new MenuItemC("選擇項1", 執行方法, ()=>true),
4    new MenuItemC("選擇項2", 執行方法, ()=>true),
5    new MenuItemC("選擇項3", 執行方法, ()=>true),
6    new MenuItemC("選擇項4", 執行方法,
7            ()=>DateTime.Now.Hour >= 19 && DateTime.Now.Hour < 22),
8  };
9

List 8 List 7中第四個菜單項的修改

這個變更,只用改寫一個Lambda表達式這樣的局部變更就能搞定,一瞬間的事。但是,如果采用最初的List 4的code,菜單項類還要加上結束時間,菜單的構建方法中還要加上判斷,相當的費事。然而,不僅如此,如果不是Lambda表達式,而是使用匿名方法的前提下,或許這種費事的方法也會得到采用。總之,匿名方法與Lambda表達式的長度上的差別對code會有質的影響。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved