MSDN對於Func<T, TResult>)的官方解釋:
封裝一個具備一個參數並返回 TResult 參數指定的類型值的方法。 html
下面經過幾個例子對比下,就容易知道其用法:sql
如下例子演示瞭如何利用委託將字符串轉化爲大寫:app
delegate string ConvertMethod(string inString);
private static string UppercaseString(string inputString)
{
return inputString.ToUpper();
}
protected void Page_Load(object sender, EventArgs e)
{
//ConvertMethod convertMeth = UppercaseString; 也能夠這樣寫
ConvertMethod convertMeth = new ConvertMethod(ppercaseString);
string name = "Dakota";
Response.Write(convertMeth(name));//經過委託調用UppercaseString方法
}
htm
這段代碼很容易理解,定義一個方法UppercaseString,功能很簡單:將字符串轉化爲大寫,而後定義一個ConvertMethod的實例來調用這個方法,最後將Dakota轉化爲大寫輸出blog
接下來改進一下,將Page_Load中的 ConvertMethod convertMeth = new ConvertMethod(ppercaseString)改成Func 泛型委託,即:字符串
protected void Page_Load(object sender, EventArgs e)
{
Func<string, string> convertMeth = UppercaseString;
string name = "Dakota";
Response.Write(convertMeth(name));
}
input
運行後,與前一種寫法結果徹底相同,這裏再聯繫官方解釋想想,Func<string, string>即爲封閉一個string類型的參數,並返回string類型值的方法string
固然,咱們還能夠利用匿名委託,將這段代碼寫得更簡潔:it
protected void Page_Load(object sender, EventArgs e)
{
Func<string, string> convertMeth = delegate(string s) { return s.ToUpper(); };
string name = "Dakota";
Response.Write(convertMeth(name));
}
泛型
怎麼樣?是否是清爽不少了,但這並非最簡潔的寫法,若是利用Lambda表達式,還能夠再簡化:
protected void Page_Load(object sender, EventArgs e)
{
Func<string, string> convertMeth = s => s.ToUpper();
string name = "Dakota";
Response.Write(convertMeth(name));
}
如今應該體會到什麼叫「代碼的優雅和簡潔」了吧? 記起了曾經學delphi時,一位牛人的預言:之後可能會出現一種新學科:程序美學! 對此,我深信不疑:優秀的代碼就是一種美!
在linq to sql中其實大量使用了Func<T, TResult>這一泛型委託,下面的例子是否是會以爲很熟悉:
protected void Page_Load(object sender, EventArgs e)
{
Func<string, string> convertMeth = str => str.ToUpper();
string[] words = { "orange", "apple", "Article", "elephant" };
IEnumerable<String> aWords = words.Select(convertMeth);
foreach (String s in aWords)
{
Response.Write(s + "<br/>");
}
}
原文連接:http://www.cnblogs.com/lin614/archive/2008/08/07/1262491.html