標籤:資料 文法 改善 功能 需要 stat 品質 注意 pre
建議37:使用Lambda運算式代替方法和匿名方法
在建議36中,我們建立了這樣一個執行個體程式:
static void Main(string[] args) { Func<int, int, int> add = Add; Action<string> print = Print; print(add(1, 2).ToString()); } static int Add(int i, int j) { return i + j; } static void Print(string msg) { Console.WriteLine(msg); }
實際上要完成相同的功能,還有很多種編碼方式。先看一種最中規中矩的,也是最繁瑣的寫法:
static void Main(string[] args) { Func<int, int, int> add = new Func<int, int, int>(Add); Action<string> print = new Action<string>(Print); print(add(1, 2).ToString()); } static int Add(int i, int j) { return i + j; } static void Print(string msg) { Console.WriteLine(msg); }
注意:上面的文法雖然繁瑣,但是我們可以從中加深對委託本質的認識:委託也是一種資料類型,跟任何FCL 中的參考型別沒有差別。
也可以使用匿名方法:
Func<int,int,int> add=new Func<int, int, int>(delegate(int i, int j) { return i + j; }); Action<string> print=new Action<string>(delegate(string msg) { Console.WriteLine(msg); });
print(add(1, 2).ToString());
使用匿名方法後,我們就不需要再Main方法外部聲明兩個方法了,可以直接在Main這個工作方法中完成所有代碼編寫,而不會影響代碼清晰性。實際上,所有程式碼數不超過3行的方法(條件是它不被重用),我們都建議採用這種方式來編寫。
上面的改進版本為:
Func<int,int,int> add=delegate(int i, int j) { return i + j; }; Action<string> print=delegate(string msg) { Console.WriteLine(msg); };
print(add(1, 2).ToString());
最終改進版本是使用Lambda運算式:
Func<int,int,int> add= (i, j) => i + j; Action<string> print= msg => Console.WriteLine(msg); print(add(1, 2).ToString());
Lambda運算式操作符“=>”的左側是方法的參數,右側是方法體,其本質是匿名方法。實際上,經過編譯後的Lambda運算式就是一個匿名方法。我們應該在實際編碼中熟練運用它,避免出現繁瑣且不美觀的代碼。
轉自:《編寫高品質代碼改善C#程式的157個建議》陸敏技
【轉】編寫高品質代碼改善C#程式的157個建議——建議37:使用Lambda運算式代替方法和匿名方法