以下内容為菩提樹下的楊過根據微軟MSDN整理,轉貼請注明出處
MSDN對于Func<T, TResult>)的官方解釋:
封裝一個具有一個參數并傳回 TResult 參數指定的類型值的方法。
下面通過幾個例子對比下,就容易知道其用法:
以下例子示範了如何利用委托将字元串轉化為大寫:
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) delegate string ConvertMethod(string inString);
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) private static string UppercaseString(string inputString)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) ...{
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) return inputString.ToUpper();
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) }
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) protected void Page_Load(object sender, EventArgs e)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) ...{
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) //ConvertMethod convertMeth = UppercaseString; 也可以這樣寫
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) ConvertMethod convertMeth = new ConvertMethod(ppercaseString);
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) string name = "Dakota";
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) Response.Write(convertMeth(name));//通過委托調用UppercaseString方法
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) 這段代碼很容易了解,定義一個方法UppercaseString,功能很簡單:将字元串轉化為大寫,然後定義一個ConvertMethod的執行個體來調用這個方法,最後将Dakota轉化為大寫輸出
接下來改進一下,将Page_Load中的 ConvertMethod convertMeth = new ConvertMethod(ppercaseString)改為Func 泛型委托,即:
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) protected void Page_Load(object sender, EventArgs e)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) Func<string, string> convertMeth = UppercaseString;
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) Response.Write(convertMeth(name));
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) 運作後,與前一種寫法結果完全相同,這裡再聯系官方解釋想一想,Func<string, string>即為封閉一個string類型的參數,并傳回string類型值的方法
當然,我們還可以利用匿名委托,将這段代碼寫得更簡潔:
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) protected void Page_Load(object sender, EventArgs e)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) Func<string, string> convertMeth = delegate(string s) ...{ return s.ToUpper(); };
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) Response.Write(convertMeth(name));
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) }
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) 怎麼樣?是不是清爽很多了,但這并不是最簡潔的寫法,如果利用Lambda表達式,還可以再簡化:
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) Func<string, string> convertMeth = s => s.ToUpper();
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) 現在應該體會到什麼叫“代碼的優雅和簡潔”了吧? 記起了曾經學delphi時,一位牛人的預言:以後可能會出現一種新學科:程式美學! 對此,我深信不疑:優秀的代碼就是一種美!
在linq to sql中其實大量使用了Func<T, TResult>這一泛型委托,下面的例子是不是會覺得很熟悉:
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) Func<string, string> convertMeth = str => str.ToUpper();
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) string[] words = ...{ "orange", "apple", "Article", "elephant" };
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) IEnumerable<String> aWords = words.Select(convertMeth);
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) foreach (String s in aWords)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) ...{
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) Response.Write(s + "<br/>");
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN) }
[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)