[原创]Func〈T, TResult〉 泛型委托 以及演变历程(整理自MSDN)

以下内容为菩提树下的杨过根据微软MSDN整理,转贴请注明出处
 
MSDN对于Func<T, TResult>)的官方解释:
封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。 

下面通过几个例子对比下,就容易知道其用法:

以下例子演示了如何利用委托将字符串转化为大写:

    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方法
    }

   
这段代码很容易理解,定义一个方法UppercaseString,功能很简单:将字符串转化为大写,然后定义一个ConvertMethod的实例来调用这个方法,最后将Dakota转化为大写输出

接下来改进一下,将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));  

    }

   
 运行后,与前一种写法结果完全相同,这里再联系官方解释想一想,Func<string, string>即为封闭一个string类型的参数,并返回string类型值的方法

当然,我们还可以利用匿名委托,将这段代码写得更简洁:

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/>");
        }
    }

时间: 2024-08-03 21:03:33

[原创]Func〈T, TResult〉 泛型委托 以及演变历程(整理自MSDN)的相关文章

如何使用.NET中的Action及Func泛型委托

委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储.传递, 之后在任何时刻进行调用,因此,C#中函数回调机制的实现基本上依赖于委托.C#的delegate关键字用于声明委托,它具有将声明委托类型映射到 System.Delegate类的能力,System.Delegate类位于mscorlib.dll中,是.NET的基础核心类之一.使用 delegate关键字声明一个委托,实质上创建了System.Delega

C# 参考:令人惊喜的泛型委托 Predicate/Func/Action

Predicate 泛型委托   表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. 看看下面它的定义:     // Summary:    //     Represents the method that defines a set of criteria and determines whether    //     the specified object meets those criteria.   

使用.NET中的Action及Func泛型委托

原文 http://www.cnblogs.com/skm-blog/archive/2013/05/24/3096294.html   委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储.传递, 之后在任何时刻进行调用,因此,C#中函数回调机制的实现基本上依赖于委托.C#的delegate关键字用于声明委托,它具有将声明委托类型映射到 System.Delegate类的能力,System.Delegate类位

C#委托基础4——泛型委托Func

C#委托基础系列原于2011年2月份发表在我的新浪博客中,现在将其般至本博客. 为了方便开发,.NET基类库针对在实际开发中最常用的情形提供了几个预定义好的委托,这些预定义委托用得很广,比如在编写lambda表达式和开发并行计算程序时经常要用到他们.   预定义泛型委托Func class Program { double AddInt(int x, int y) { return x + y; } string AddString(string s1, string s2) { return

表达式树和泛型委托

什么是表达式树? 表达式树又称为表达式目录树,以数据形式表示语言级代码.所有的数据都存储在树结构中,每个结点表示一个表达式(Expression).要想手动生成表达式树我们需要引用System.Linq.Expressions 命名空间,最重要的一个类是Expression,它是所有表达式的基类.例如: 1:参数表达式:ParameterExpression,就是一个方法中的参数,例如 search(string key),key可以看成是一个参数表达式. 2:二元表达式:BinaryExpre

艾伟:表达式树和泛型委托

什么是表达式树? 表达式树又称为表达式目录树,以数据形式表示语言级代码.所有的数据都存储在树结构中,每个结点表示一个表达式(Expression).要想手动生成表达式树我们需要引用System.Linq.Expressions 命名空间,最重要的一个类是Expression,它是所有表达式的基类.例如: 1:参数表达式:ParameterExpression,就是一个方法中的参数,例如 search(string key),key可以看成是一个参数表达式. 2:二元表达式:BinaryExpre

C#动静结合编程之四:泛型委托

多态 多态是什么?一句话:接口和实现的1:n映射.多态让程序能通过统一的接口(广义的接口,意指规范 )调用不同的实现,从而增强程序的表达能力和灵活性.我们最为熟悉的多态形式是包括接口继承在内的 类型多态: var animals = new List<IAnimal>() { new Cat("Missy"), new Cat("Mr. Bojangles"), new Dog("Lassie") }; foreach (var an

Visual Studio 2010:泛型委托的协变、逆变Demo

在编程语言中,"协变"是指能够使用与原始指定的派生类型相比,派生程度 更大的类型."逆变"则是指能够使用派生程度更小的类型.在 .NET Framework 4 和 Visual Studio 2010 中,C# 和 Visual Basic 都支持在泛型接口和委托中 使用协变和逆变,并允许隐式转换泛型类型参数. 如果泛型接口或委托的泛型参数声明为协变或逆变,则将该泛型接口或委托称 为"变体".C# 和 Visual Basic 都允许您创建自己

泛型委托在项目中的应用

感悟:对泛型委托基本属于有点认识,但从来没真正在项目中使用过,有时感觉没有合适的场景应用,但看了artech兄的文章,我才明白,原来泛型委托真的可以做很多事情,而且效果往往是没有使用委托所达不到的. Action<T> 泛型委托:封装一个方法,该方法只采用一个参数并且不返回值.可以使用此委托以参数形式传递方法,而不用显式声明自定义的委托.该方法必须与此委托定义的方法签名相对应.也就是说,封装的方法必须具有一个通过值传递给它的参数,并且不能返回值.当然泛型委托不只是只能支持一个参数,它最多可以支