.NET中的Func委託用法

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

相關文章
相關標籤/搜索