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

    }

原文链接:http://www.cnblogs.com/lin614/archive/2008/08/07/1262491.html

.NET中的Func委托用法的更多相关文章

  1. C#中常见的委托(Func委托、Action委托、Predicate委托)

    今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景. Func,Action,Predicate全面解析 首先来说明Func委托,通 ...

  2. Aap.Net中的Action和Func委托

    前言 最近在阅读某开源框架源码的时候,发现作者在其中运用了很多Action委托和Func委托,虽然我之前在项目中也有一些对委托的实操,但还是免不了长时间的不用,当初消化的一些委托基础都遗忘了...索性 ...

  3. C#扫盲篇(三):Action和Func委托--实话实说

    一.基础定义 老王想找老张的老婆出去耍,但是一看,老张还在厨房煮饭.于是老王就对老张隔壁的淑芬说:"等下老张吃完饭出去喝茶,你就把前门晒的苞谷收了,老张从左门出,你就收右边的苞谷,我就知道从 ...

  4. Func委托与表达式树Expression

    最近在写ORM框架,其中遇到一个难点,就是作为框架调用方如何将查询条件传入框架内.其中就用到了Expression. Func委托 要Expression先要了解Func委托,Func委托的样式是: ...

  5. C#中ref关键字的用法总结

    ref表示引用的意思,C#中它有多种用法,这里简单总结一下: 1.按引用传递参数 具体可见:C#中的值传递与引用传递(in.out.ref) 2.引用局部变量 引用局部变量指的是在变量声明时使用ref ...

  6. Action<>和Func<> 委托【代理】

    C#中的Action<>和Func<> 其实他们两个都是委托[代理]的简写形式. 一.[action<>]指定那些只有输入参数,没有返回值的委托 Delegate的 ...

  7. 通过Func 委托理解委托和匿名方法及Lambda 表达式

    Func<T, TResult> 委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 命名空间: System 程序集: mscorlib(在 mscorlib.d ...

  8. C#之Action和Func的用法

    以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发 ...

  9. C#内置泛型委托:Func委托

    1.什么是Func委托 Func委托代表有返回类型的委托 2.Func委托定义 查看Func的定义: using System.Runtime.CompilerServices; namespace ...

随机推荐

  1. 折腾了好久,thinkphp5打开提示加载failed to open stream: No such file or directory in think start.php

    GIT上下载的THINKPHP5记得先 composer update 我就是没update ,折腾了1个小时,才想起来这个事 thinkphp5默认首页打开空白 打开报错提示  提示thinkphp ...

  2. jmap Exception in thread "main" java.io.IOException: 拒绝访问。

    环境: 现有一个独立运行的系统S(有独立的jre,但是没jdk),现想通过jmap导出其内存堆栈信息.于是另外安装一个jdk.可是jdk的版本跟S系统的jre不能对应上.出了很多错误. 总是报错: C ...

  3. mock——test 基本所有使用

    可以参考:http://www.cnblogs.com/lyy-2016/p/6122144.html test /** * */ package com.imooc.web.controller; ...

  4. 1.java生成随机不重复10位字符串

    package org.changneng.util; import java.util.Random; public class A { public static void main(String ...

  5. Maven打包跳过测试,文档生成

    运行mvn install时跳过Test 方法一: <project> [...] <build> <plugins> <plugin> <gro ...

  6. Ambari安装Hadoop集群

    * System Environment:centOS6.7 1.Prepare the Environment 1)Set Up Password-less SSH : (Generate publ ...

  7. python global nonlocal

    global: 方法之外在modual中的变量定义为全局变量.方法内的变量为局部变量. 一般情况下,全局变量可以被使用,但是不应该被修改,不然会报错. 不过一般不建议对全局变量做修改,如果有多个方法都 ...

  8. mysql之explain

    ⊙ 使用EXPLAIN语法检查查询执行计划   ◎ 查看索引的使用情况   ◎ 查看行扫描情况   ⊙ 避免使用SELECT *   ◎ 这会导致表的全扫描   ◎ 网络带宽会被浪费   话说工欲善其 ...

  9. C#实现支持单点登录的一个存储用户信息的类

    网上有很多介绍单点登录的文章,但多为架构设计以及概念性文章,而本文将介绍单点登录的具体具体实现 利用哈希表,作为保存登录用户的队列        private static Hashtable m_ ...

  10. 关于frameset与iframe的使用

    <frameset>与<body>标签同级,是不能同时存在的,<frameset>是把当前页面进行分割. frameset.html: <!DOCTYPE h ...