一、委托

1.1 委托的定义

delegate(委托)是一种可用于封装命名方法或匿名方法的引用类型, 委托类似于 C++ 中的函数指针;

.Net通过委托来提供回调函数机制。

声明一个委托类型

internal delegate void Feedback(Int32 value);

一个简单的实例

namespace CLRExer.Delegates
{
//委托定义
public delegate void FeedBack(int input); public class SimpleDelegateDemo
{
public void Excute()
{
FeedBack fb = new FeedBack(DoNothing);
fb(1);
//fb.Invoke(1);
} /// <summary>
/// 被调用的方法
/// </summary>
/// <param name="input"></param>
private void DoNothing(int input)
{
Console.WriteLine("input is {0};", input);
}
}
}

运行结果:

可以看到委托的使用:用C#的delegate定义一个委托,用new操作符构造委托实例,最后用方法调用回调函数,执行成功

为了使用方便,.net framework提供了委托的包装类,Action和Func,是C#的语法糖。

二、Action

Action是无返回值的委托,.net framework提供了17个Action委托,他们从无参到最多16个参数;

几个简单的例子:

2.1 无输入参数无返回值的委托

Action action= () => { };

2.2 一个输入参数无返回值的委托

Action<int> ac = x => Console.WriteLine("this is {0}", x);

2.3 多个输入参数的委托

     Action<int, int, int> action2= InputDemo;
action2(1, 2, 3);
private void InputDemo(int input1, int input2, int input3)
{
Console.WriteLine("this is input1:{0},this is input2:{1},this is input3:{2}", input1, input2, input3);
}

三、Func

Func是有返回值的委托,.net framework同样提供了17个Func委托,他们从无参到最多16个参数;

3.1 无输入参数,有一个返回值的委托

Func<long> func1 = () => { return 1; };

3.2 一个输入参数,有一个返回值的委托

//表示一个输入参数n,一个返回值sum
Func<long, long> func2 = n => {
Int64 sum = 0;
for (; n > 0; n--) {
checked {
sum += n;
}
}
return sum;
};

四、小结

1、委托可以理解为方法的指针,指向一个方法;
2、Action和Func也是委托,是.net framework提供的包装委托,经常和lambda表达式一起使用;
3、当无返回值时,使用Action;当有返回值时,使用Func。

浅析C#之委托、Action、Func的更多相关文章

  1. C#委托Action、Action<T>、Func<T>、Predicate<T>

    CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...

  2. 委托,C#本身的委托(Action Func)

    1.Action 分为带泛型的和不带泛型的,带泛型可传入任何类型的参数. 格式如下: using System; using System.Collections.Generic; using Sys ...

  3. (C#) Action, Func, Predicate 等泛型委托

    (转载网络文章) (1). delegate delegate我们常用到的一种声明   Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型.   例:public del ...

  4. Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)

    Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...

  5. 委托(Func与Action)

    1.平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Sa ...

  6. 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解

    1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...

  7. [转]C#委托Action、Action<T>、Func<T>、Predicate<T>

    CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...

  8. 关于线程间操作无效: 从不是创建控件“xx”的线程访问它,错误解决方法(自定义委托和系统委托Action或Func解决)

    这是一个线程不安全的问题.跨线程操作问题. 比如我们需要在线程中改变textbox的文本,textbox的name是txtShowMsg 第一种方法(不推荐使用) 在窗体构造函数中写Control.C ...

  9. c# Action,Func,Predicate委托

    System命名空间下已经预先定义好了三中泛型委托,Action,Func和Predicate,这样我们在编程的时候,就不必要自己去定义这些委托了 Action是没有返回值的 Func是带返回值的 不 ...

  10. 系统内置委托Action和func

    Action委托, action是系统内置的委托,它可指向无返回值,没有参数的方法. using System; using System.Collections.Generic; using Sys ...

随机推荐

  1. uva11400 动态规划

    没种电压灯泡要么全换,要么不换.状态d(i)表示前i种灯泡的最低价格. 转移方程: dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*d[i].c+d[i].k); AC代码: #i ...

  2. nyoj222 整数中的1 数位DP

    从a枚举到b是一定会超时的.此题应该考虑数位dp,也可以理解为递推,假设给定数n,就能在O(32)复杂度算出所有小于等于n的数中1出现的次数,那么给定区间[a, b],solve(b) - solve ...

  3. STL中坑爹的max函数

    hdu1754永远难忘的痛,参数最好不要传耗时特别长的函数,因为会调用两次,如果是递归的话,不知道多少次呢.. 切记!切记!切记! 例如: //return max(getAns(root<&l ...

  4. 浅谈CDN、SEO、XSS、CSRF

    CDN 什么是CDN 初学Web开发的时候,多多少少都会听过这个名词->CDN. CDN在我没接触之前,它给我的印象是用来优化网络请求的,我第一次用到CDN的时候是在找JS文件时.当时找不到相对 ...

  5. Luogu P2419 [USACO08JAN]牛大赛Cow Contest

    题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a p ...

  6. shell 脚本——判断条件

    在之前的shell语言学习笔记中已经写过shell的几种判断语句及循环语句,也简单的介绍了shell语言判断语句和判断条件.在此再做进一步学习. test命令的测试功能 test命令用于检测系统文件及 ...

  7. Linux基础五

    Yum软件包管理 yum:基于rpm包构建的软件更新机制 自动解决软件包依赖关系 所有软件包由集中的yum软件仓库提供. [root@hydra桌面]#ls /misc/cd/repodata/ (r ...

  8. 【Unity3D】Unity3D 摄像机带透明截图

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/CropCamera.html ↓↓↓下面的废话可以不看↓↓↓ 最近处理了一批我的游戏的图标,步骤特别繁琐, 需要先 ...

  9. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 上一篇(R语言实现︱局部敏感哈希算法(LSH) ...

  10. 引导加载程序之争: LILO 和 GRUB

    在不考虑他们的工作或专业情况下,所有 Linux 用户都会使用的是哪个工具?引导加载程序.通过本文了解引导加载程序的工作原理,认识两个流行的引导加载程序 LILO(LInux LOader)和 GNU ...