Func<T, TResult>是系统的内置委托的中最常用的一个。特点就是必须有一个返回值。(func委托有多个重载,所有重载的最后一个参数就是返回值的类型,前面的是参数类型)。注:没有返回值的系统内置委托是Action<T>

Func委托的作用就是当我们需要传入n参数并有返回值时,我们不用再去定义一个委托,直接调用func即可。

例如: 当我们输入一个字符串,然后把这个字符串转换为大写并返回。

我们最原始的做法是:先写一个方法

        public string toUpperStr(string SourceStr)
{
return SourceStr.ToUpper();
}

然后调用

        public ActionResult Index()
        {
            string sourceStr = "SuGuoTong";
            ViewBag.Result = ToUpperStr(sourceStr);
            return View();
        }

但如果还需要把字符串改成小写,还得在增加一个方法,为了方便,所以我们引进委托。

更重要的是上面的代码一看就是屌丝代码,为了高大上,为了白富美,我们在行动。

        delegate string ConvertMethod(string str);//传入一个参数和返回一个返回值的委托
public ActionResult Index()
{
string sourceStr = "SuGuoTong";
ConvertMethod convert = ToUpperStr;
ViewBag.Result = convert(sourceStr);
return View();
}
public string ToUpperStr(string SourceStr)
{
return SourceStr.ToUpper();
}

把上面我们自己声明的委托改为系统内置的委托Func<T, TResult>

        public ActionResult Index()
        {
            string sourceStr = "SuGuoTong";
            Func<string, string> convert = ToUpperStr; //Func<string,string>第一个string是参数类型,第二个string是返回值类型
            ViewBag.Result = convert(sourceStr);
            return View();
        }
        public string ToUpperStr(string SourceStr)
        {
            return SourceStr.ToUpper();
        }
//变白了,想不想变富

为了变富,我们把下面的方法也去掉,这时候就要用到匿名方法

        public ActionResult Index()
{
string sourceStr = "SuGuoTong";
Func<string, string> convert = delegate(string s) { return s.ToUpper(); };
ViewBag.Result = convert(sourceStr);
return View();
}
//是不是又白又富了,想不想变美

为了变美,我们引进lambda(亚麻带)表达式

        public ActionResult Index()
{
string sourceStr = "SuGuoTong";
Func<string, string> convert = o=>o.ToUpper();
ViewBag.Result = convert(sourceStr);
return View();
}
//成了白富美,就可以进军岛国了

完!

调用系统方法需传入func的例子:

            string[] strAry = { "gs","gsd","htrh"};
var resl = strAry.Select<string, string>(o => o.ToUpper());

附:匿名方法

关于调用系统的方法,我们需要传匿名方法的例子很多:

比如Array.ConvertAll方法把一个string[]转换成int[]

这就是需要我们传一个匿名方法(传入一个string类型参数,返回一个int类型的匿名方法)

intArr = Array.ConvertAll<string, int>(str, delegate(string s) { return int.Parse(s) * ; });
或直接用lambda代替
intArr = Array.ConvertAll<string, int>(str, o => int.Parse(o) * 5);

Func<T, TResult> 委托的由来和调用和好处(为了高大上,为了白富美)的更多相关文章

  1. 参考例子,学习Func<T, TResult>委托

    这些天,开发ASP.NET MVC,其间有查找资料,发现一个全新的Func<T, TResult> 委托.让我们在开发时,节省与简化很多. 在开发过程中,我们需要把一个泛型List< ...

  2. Func<T, TResult> 委托

    Func<T, TResult> 委托 Visual Studio 2008   命名空间:  System程序集:  System.Core(在 System.Core.dll 中) 语 ...

  3. func 和action 委托的使用

    func 可以带返回值,action  不带返回值 平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委 ...

  4. Expression<Func<T,TResult>>和Func<T,TResult>

    1.Expression<Func<T,TResult>>是表达式 //使用LambdaExpression构建表达式树 Expression<Func<int, ...

  5. Func<T,TResult>泛型委托

    描述: 封装一个具有一个参数并返回TResult参数指定的类型值的方法. 语法: public delegate TResult Func<T,TResult>(T arg); 参数类型: ...

  6. C# 笔记 Func<TResult> 委托、Action<T> 委托

    https://blog.csdn.net/wanglui1990/article/details/79303894 Func<ΤResult> 委托:代理(delegate)一个返回类型 ...

  7. 使用Func<T1, T2, TResult> 委托返回匿名对象

    Func<T1, T2, TResult> 委托 封装一个具有两个参数并返回 TResult 参数指定的类型值的方法. 语法 public delegate TResult Func< ...

  8. Func<T,TResult>的使用方法(转载)

    public delegate TResult Func <T, TResult>(T arg) 这是一个委托方法,这个方法有一个参数T(T arg),比如int arg,string a ...

  9. Func 和 Action 委托

    有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action.如下所示(下面的in表示参数,out表示返回结果): delegate TResult ...

随机推荐

  1. Spark源码分析环境搭建

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3868718.html 本文主要分享一下如何构建Spark源码分析环境.以前主要使用eclipse来阅读源 ...

  2. Ubuntu--服务器版本系统安装图解教程

    附Ubuntu Server 13.04系统镜像下载地址: 32位:http://mirrors.163.com/ubuntu-releases/13.04/ubuntu-13.04-server-i ...

  3. android-exploitme(五):不安全的数据存储

    今天我来看看如果android将数据存储在sdcard,它的权限是什么样的 1. 打开emm软件,做一笔转账.

  4. nodejs 操作mysql

    这篇文章主要介绍了nodejs中操作mysql数据库示例,本文演示了如何在NodeJS中创建创建mysql连接.mysql数据库.插入数据.查询数据等功能,需要的朋友可以参考下  引言: 继前面的No ...

  5. sublime3配置Quick-X+自动错误提示

    sublime3配置 安装Package Control 配置Quick-x API提示 配置Lua自动语法错误提示 sublime3 安装 Package Control View->Show ...

  6. 【USACO】【section1.1】Your Ride Is Here

    以前的账号忘记了,只能从头了. 入门题不解释,就是sumg和sumc初始值置1不能置0.开始享用一个循环计算出sumg和sumc,其实两个数组最大程度为6,节省不了什么时间. /*ID:Moment1 ...

  7. 同一Session中的aspx页面的并发限制

    项目中客户端采用WebBrowser展示aspx页面,用户有可能打开带多个带WebBrowser的winform窗体.此时,如果其中一个的WebBrowser的aspx页面响应较长的话,其他窗体中的W ...

  8. win8.1下解决Visual C++不兼容的方法

    1.下载visual c++的安装包 百度云下载地址为:http://pan.baidu.com/s/1c0dRAYs 2.修改MSDEV.EXE文件名 安装完成后在安装目录下找到MSDEV.EXE, ...

  9. 在LINUX上创建GIT服务器【转】

    转自:http://blog.csdn.net/xiongmc/article/details/9176785 如果使用git的人数较少,可以使用下面的步骤快速部署一个git服务器环境. 1. Cli ...

  10. Google 网络库Volley简介

    Volley是什么? 2013 Google I/O 大会发布的Android平台网络通讯库,旨在帮助开发者实现更快速,简单,健壮的网络通讯.支持网络图片的缓存加载功能. 适用场景:数据量不大,但是通 ...