曾经我们为了可以调用一个方法。必须比照这种方法定义一个对应的delegate.

原先我们定义delegate

// 托付声明 -- 定义一个签名:
delegate double MathAction(double num);
class DelegateTest
{
// 符合托付声明的常规方法
static double Double(double input)
{
return input * 2;
} static void Main()
{
原版: // 使用一个命名方法实例化托付类型
MathAction ma = Double; // 调用托付实例
double multByTwo = ma(4.5);
Console.WriteLine(multByTwo); 简化版1: // 再用匿名方法来实例化托付类型
MathAction ma2 = delegate(double input)
{
return input * input;
}; double square = ma2(5);
Console.WriteLine(square); 简化版2: // 最后用Lambda表达式来实例化托付类型
MathAction ma3 = s => s * s * s;
double cube = ma3(4.375); Console.WriteLine(cube);
}
}

这个能否有更好的实现办法呢?

答案是:肯定有了.也就是有通用的delegate了。

在.NETFramework
3.5中。提供了两类通用的delegate。

假设方法有返回值,则使用Func,或者Func<>

假设方法没有返回值,则使用Action,或者Action<>

Func<T,TR>(T arg)

參数类型

T

此托付封装的方法的參数类型。

TR

此托付封装的方法的返回值类型。

參数

arg
类型 T

此托付封装的方法的參数。

在使用 Func<T,TResult>托付时,不必显式定义一个封装仅仅有一个參数的方法的托付。下面演示样例简化了此代码,它所用的方法是实例化
Func<T, TResult>托付,而不是显式定义一个新托付并将命名方法分配给该托付。

使Func<>托付,我们这样写

using System;

public classLambdaExpression
{
public static void Main()
{
Func<string, string> convert = s=> s.ToUpper();//该方法将小写字母转为大写
string name = "Dakota";
Console.WriteLine(convert(name));
}
}

Func托付是system下的全局函数,不用我们自定,系统自己定义的,供我们使用,带有多个重载.

这里我们除了使用Func托付外,还是用了Labdab表达式.这里我再谈谈这个表达式.

Lambda表达式的基础类型是泛型 Func托付之中的一个。 这样能以參数形式传递
lambda表达式,而不用显式将其分配给托付。

尤其是,由于 System.Linq命名空间中很多类型方法具有Func<T,
TResult>參数,因此能够给这些方法传递 lambda表达式。而不用显式实例化
Func<T, TResult>托付。

以下一行代码将生成一个序列,当中包括 numbers 数组中在
9左側的全部元素。由于它是序列中第一个不满足条件的数字:

int[] n= { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstNumbersLessThan6 = numbers.TakeWhile(n => n < 6);

实例2

var firstSmallNumbers =numbers.TakeWhile((n, index) => n >= index);

此演示样例展示了怎样通过将输入參数括在括号里来指定多个输入參数。该方法将返回数字数组中的全部元素,直至遇到一个值小于其位置的数字为止。不要将
lambda运算符 (=>)与大于等于运算符 (>=)混淆。

三种托付写法对照

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace func
{
//托付声明 -- 定义一个签名:
delegate double MathAction(double num);
public class Program
{
// 符合托付声明的常规方法
static double Double(double input)
{
return input * 2;
} static void Main(string[] args)
{
// 使用一个命名方法实例化托付类型
/*
* 写法一,须要写出专门托付的函数,还须要自己定义托付
**/
MathAction ma = Double;//注意这里千万不可有Double(),否则就成了一个返回类型。是报错的,这里是制定函数的地址,给定的是函数的地址 //调用托付
double result1 = ma(4.5); //使用系统自己定义托付实例化托付类型
/*
* 写法二。须要写出专门托付的函数。不须要自己定义托付。使用系统托付
**/
Func<double,double> func = Double; //调用托付
double result2 = func(4.5); //系统托付使用lamdba进行传递參数
/*
* 写法三。不须要写出专门托付的函数。还须要自己定义托付
**/
Func<double, double> result = s=> s * 2;//写法还能够换成lamdba语句块,适应多个參数的写法 double result3=result(4.5); Func<double,double> result4 = s =>
{
return s * 2;
}; Console.WriteLine(result1);
Console.WriteLine(result3);
Console.WriteLine(result2);
Console.WriteLine(result4(4.5));
}
} }

效果图

相同的输出效果,可是编写代码的质量确有不同。当然了也是要对自己的问题进行负责的。lamdba的使用简化的代码。可是假设自己不是对这个非常熟悉,非常easy造成出现故障,如从着手错误的源泉。匿名函数的写法解决的这个问题。可是匿名函数却没有Lamdba简便。这就是折中方法吧。看自己更喜欢哪种了。

小结:

从Func的托付中。我们能够看出,它简化了我们自定义托付带来的繁琐。同一时候它更好的结合了Lamdba的使用。降低了自定义函数的作用。同一时候也是有缺点的,就是错误的出现不easy发现是那里。

Action托付的使用与Func雷同。这里就不在说了。希望自己的总结能够对大家有所帮助。

C# Func&lt;&gt;托付的更多相关文章

  1. 6.5.2 C# 中的函数组合

    6.5.2 C# 中的函数组合 C# 中的函数组合是可能的.但使用非常有限,这是部分是由于在 C# 中散应用不能非常easy使用.但更重要的是,由于大多数操作是用成员来写的.而不是函数.但我们至少能够 ...

  2. c#Lamdba表达式与托付

    介绍: "Lambda表达式"(lambda expression)是一个匿名函数,在C#3.0中引入了lambda表达式,它是对匿名函数的一种简化,能够包括表达式和语句,而且可用 ...

  3. 浅析C#中的托付

    托付是寻址方法的.NET版本号.在C++中.函数指针仅仅只是是一个指向内存位置的指针,它不是类型安全的.而.NET托付全然不同,托付是安全类型的类,它定义了返回类型和參数的类型. 当把方法传递给其它方 ...

  4. C#托付之愚见

    C#托付起源 近期參加实习和奔走于各大招聘会,被问及非常多技术方面的问题.C#问的较多的就是托付和linq. linq之前已经写过一篇文章,能够參见 http://blog.csdn.net/yzys ...

  5. C#基础知识六之委托(delegate、Action、Func、predicate)

    1. 什么是委托 官方解释 委托是定义方法签名的类型,当实例化委托时,您可以将其实例化与任何具有兼容签名的方法想关联,可以通过委托实例调用方法. 个人理解 委托通俗一点说就是把一件事情交给别人来帮助完 ...

  6. C#委托的介绍(delegate、Action、Func、predicate)

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明   Deleg ...

  7. winform总结2> Action<> ,Action,func<>,委托相关的理解

    1,他们是什么: Action 封装一个方法,该方法不具有参数并且不返回值. Action<> 封装一个方法,该方法具有最多16个参数并且不返回值. func<> 封装一个具有 ...

  8. Func

    Func<List<int>, string> getStr = (list) => { var returnStr = ""; if (list.A ...

  9. 浅谈C#中常见的委托<Func,Action,Predicate>(转)

    一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的. 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇.我就不 ...

随机推荐

  1. H264相关知识

    1.基本概念 I frame :帧内编码帧 又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象 ...

  2. 认识Java虚拟机的内部体系结构、gc示例

    认识Java虚拟机的内部体系结构 Java虚拟机的内部体系结构也许很少有人去关心,因为对于Java程序员来说,一般只需要跟API打交道就可以了.这些体系结构只是Java虚拟机内部的结构而已.但是如果理 ...

  3. Storm入门教程 第三章Storm集群安装部署步骤、storm开发环境

    一. Storm集群组件 Storm集群中包含两类节点:主控节点(Master Node)和工作节点(Work Node).其分别对应的角色如下: 主控节点(Master Node)上运行一个被称为N ...

  4. android让你的TabHost滑动起来

    在Android应用中,一般TabActivity和若干个Tab选项卡(TabWidget).如果选项卡的数量超过了5个,就不适合放到一个屏幕中,这样可以让这些选项卡滑动起来. 滑动的选项卡的实现有好 ...

  5. Windows 窗体最小化和隐藏的区别及恢复

    应用程序有托盘图标,窗体最小化或者隐藏窗体时,点击托盘图标需要恢复窗体显示,并且恢复之前的现实状体,正常大小或者最大化显示.例如:最大化显示窗体时,点击最小化按钮,窗体最小化,点击托盘图标将最大化显示 ...

  6. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(7)

    检索文档(Retrieving documents) 我们已经有文档存储在我们的实例.现在,让我们尝试检索它们: curl -XGET http://localhost:9200/blog/artic ...

  7. bjfu1164 Parity Game

    简单规律题.首先想到的是,若01串中1有n个,则可以通过操作,使串中1的个数变为n-1.n-2……1.0个:第2个想到的是,如果n为奇数,可以通过操作,使串中1的个数最多变为n+1,而若n为偶数,则无 ...

  8. 【LeetCode 169】Majority Element

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  9. 让Apache支持ASP.NET

    Apache是目前广泛使用的一种网络服务器程序,不仅在UNIX/LINUX平台上被大量使用,而且在Windows平台上也有许多站点放弃了IIS 而转向Apache..NET是微软推出的功能强大的开发技 ...

  10. Web自动化框架之五一套完整demo的点点滴滴(excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试报告+对接缺陷管理系统+自动编译部署环境+自动验证false、error案例)

    标题很大,想说的很多,不知道从那开始~~直接步入正题吧 个人也是由于公司的人员的现状和项目的特殊情况,今年年中后开始折腾web自动化这块:整这个原因很简单,就是想能让自己偷点懒.也让减轻一点同事的苦力 ...