天天看點

[原創]Func〈T, TResult〉 泛型委托 以及演變曆程(整理自MSDN)

以下内容為菩提樹下的楊過根據微軟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)