.NET中的Func委托用法

摘要:
MSDN对Func的官方解释:封装了一个具有参数的方法,并返回TResult参数指定的类型值。是不是更新鲜了,但这不是最简单的写法。如果使用lambda表达式,可以简化它:protectedvoidPage_Load{Func<string,string>convertMeth=s=>s.ToUpper();stringname=“Dakota”;Response.Write;}现在你应该意识到什么叫做“代码的优雅和简洁”了?想起一个牛人在学习德尔菲时的预言,一个新的学科可能会出现:程序美学!因此,我坚信好的代码是一种美!

MSDN对于Func<T, TResult>)的官方解释:
封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。 

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

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

.NET中的Func委托用法第1张    delegate string ConvertMethod(string inString);
.NET中的Func委托用法第1张
.NET中的Func委托用法第1张    private static string UppercaseString(string inputString)
.NET中的Func委托用法第4张    {
.NET中的Func委托用法第5张        return inputString.ToUpper();
.NET中的Func委托用法第6张    }
.NET中的Func委托用法第1张
.NET中的Func委托用法第1张    protected void Page_Load(object sender, EventArgs e)
.NET中的Func委托用法第4张    {       
.NET中的Func委托用法第5张        //ConvertMethod convertMeth = UppercaseString; 也可以这样写
.NET中的Func委托用法第5张        ConvertMethod convertMeth = new ConvertMethod(ppercaseString);
.NET中的Func委托用法第5张        string name = "Dakota";
.NET中的Func委托用法第5张        Response.Write(convertMeth(name));//通过委托调用UppercaseString方法
.NET中的Func委托用法第6张    }
.NET中的Func委托用法第1张

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


接下来改进一下,将Page_Load中的 ConvertMethod convertMeth = new ConvertMethod(ppercaseString)改为Func 泛型委托,即:

.NET中的Func委托用法第1张  protected void Page_Load(object sender, EventArgs e)
.NET中的Func委托用法第4张    {
.NET中的Func委托用法第5张        Func<string, string> convertMeth = UppercaseString;
.NET中的Func委托用法第5张        string name = "Dakota";
.NET中的Func委托用法第5张        Response.Write(convertMeth(name));  
.NET中的Func委托用法第5张
.NET中的Func委托用法第6张    }
.NET中的Func委托用法第1张


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

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

.NET中的Func委托用法第1张protected void Page_Load(object sender, EventArgs e)
.NET中的Func委托用法第4张    {
.NET中的Func委托用法第26张        Func<string, string> convertMeth = delegate(string s) { return s.ToUpper(); };
.NET中的Func委托用法第5张        string name = "Dakota";
.NET中的Func委托用法第5张        Response.Write(convertMeth(name));
.NET中的Func委托用法第6张    } 
.NET中的Func委托用法第1张

   
怎么样?是不是清爽很多了,但这并不是最简洁的写法,如果利用Lambda表达式,还可以再简化:

.NET中的Func委托用法第1张protected void Page_Load(object sender, EventArgs e)
.NET中的Func委托用法第4张    {
.NET中的Func委托用法第5张        Func<string, string> convertMeth = s => s.ToUpper();
.NET中的Func委托用法第5张        string name = "Dakota";
.NET中的Func委托用法第5张        Response.Write(convertMeth(name));
.NET中的Func委托用法第6张    }

   
现在应该体会到什么叫“代码的优雅和简洁”了吧? 记起了曾经学delphi时,一位牛人的预言:以后可能会出现一种新学科:程序美学! 对此,我深信不疑:优秀的代码就是一种美!

在linq to sql中其实大量使用了Func<T, TResult>这一泛型委托,下面的例子是不是会觉得很熟悉:

.NET中的Func委托用法第1张protected void Page_Load(object sender, EventArgs e)
.NET中的Func委托用法第4张    {
.NET中的Func委托用法第5张        Func<string, string> convertMeth = str => str.ToUpper();        
.NET中的Func委托用法第26张        string[] words = { "orange", "apple", "Article", "elephant" };        
.NET中的Func委托用法第5张        IEnumerable<String> aWords = words.Select(convertMeth);
.NET中的Func委托用法第5张        foreach (String s in aWords)
.NET中的Func委托用法第26张        {
.NET中的Func委托用法第5张            Response.Write(s + "<br/>");
.NET中的Func委托用法第45张        }

.NET中的Func委托用法第6张    }

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

免责声明:文章转载自《.NET中的Func委托用法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇总目录iOS开发之Block下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ONNX-开放式神经网络交换格式

以下内容根据个人理解整理而成,如有错误,欢迎指出,不胜感激。 1. ONNX简介 ONNX是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存储模型数据并交互。 ONNX的规范及代码主要由微软,亚马逊 ,Facebook 和 IBM 等公司共同开发,以开放源代码的方式...

jdk8 新特性stream().map()

1.大写字符串列表 1.1 简单的Java示例将Strings列表转换为大写 TestJava8.java package com.mkyong.java8; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.uti...

SpringBoot集成redisson分布式锁

原文链接:https://blog.csdn.net/sinat_25295611/article/details/80420086 https://www.cnblogs.com/yangzhilong/p/7605807.html 业务场景:在电商项目中,往往会有这样的一个功能设计,当用户下单后一段时间没有付款,系统就会在超时后关闭该订单。 通常我们会...

java多线程读取、操作List集合

import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.ArrayUtils;   public class Test_4 {     /**      * 多线程处理list      *       * @param ...

IOS开发之__bridge,__bridge_transfer和__bridge_retained (转)

Core Foundation 框架Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。下面列举该框架支持进行管理的数据以及可提供的服务: 群体数据类型 (数组、集合等)程序包字符串管理日期和时间管理原始数据块管理偏好管理URL及数据流操作线程和RunL...

xml中“ &amp;lt; &amp;gt; ”转义为“ &amp;amp;lt; &amp;amp;gt; ”问题处理

曾经也碰到过类似问题,解决方法是在发送或者解析报文前执行上面的方法将内容转义一下,现在我用dom4j组装如下的报文(报文体中内容传输时加密处理),大致介绍一下上面方法的使用,具体看代码。 importjava.io.StringReader; importjava.io.StringWriter; importjava.math.BigDecima...