浅析C#之委托、Action、Func
一、委托
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的更多相关文章
- C#委托Action、Action<T>、Func<T>、Predicate<T>
CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...
- 委托,C#本身的委托(Action Func)
1.Action 分为带泛型的和不带泛型的,带泛型可传入任何类型的参数. 格式如下: using System; using System.Collections.Generic; using Sys ...
- (C#) Action, Func, Predicate 等泛型委托
(转载网络文章) (1). delegate delegate我们常用到的一种声明 Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型. 例:public del ...
- Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)
Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...
- 委托(Func与Action)
1.平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Sa ...
- 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解
1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...
- [转]C#委托Action、Action<T>、Func<T>、Predicate<T>
CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...
- 关于线程间操作无效: 从不是创建控件“xx”的线程访问它,错误解决方法(自定义委托和系统委托Action或Func解决)
这是一个线程不安全的问题.跨线程操作问题. 比如我们需要在线程中改变textbox的文本,textbox的name是txtShowMsg 第一种方法(不推荐使用) 在窗体构造函数中写Control.C ...
- c# Action,Func,Predicate委托
System命名空间下已经预先定义好了三中泛型委托,Action,Func和Predicate,这样我们在编程的时候,就不必要自己去定义这些委托了 Action是没有返回值的 Func是带返回值的 不 ...
- 系统内置委托Action和func
Action委托, action是系统内置的委托,它可指向无返回值,没有参数的方法. using System; using System.Collections.Generic; using Sys ...
随机推荐
- Django 学习笔记
day 1 : 一.web 框架本质: 1.http 建立在tcp 之上:一次互通后断开,无状态,短链接 请求头: b'GET / HTTP/1.1 Host: 127.0.0.1:8080 Conn ...
- ehcache的基本使用及Spring整合
1.ehcache:百度百科这样解释的,EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.总的来说,他的出现就是减少对数据 ...
- Docker系统八:Docker的存储驱动
Docker存储驱动 1. Docker存储驱动历史 Docker目前支持的greph driver包括: AUFS device-mapper btrfs overlayfs(重点) 关于各存储驱的 ...
- day6(列表操作、列表练习题)
一.列表操作 a) 循环 基本语法 for i in value : L1 =['a','b','c','d',1,2,3,4,5,6,'b','D'] for i in L1: print(i) ...
- accordion 分类
<!--accordion--><h1>accordion 分类</h1><div id="accordionId" class=&quo ...
- yii学习笔记--使用gii快速创建控制器和模型
配置gii 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'123456',//使用gii的密码 // If ...
- CAN控制器-配置过滤器
首先简单介绍一下CAN总线,关于CAN总线是谁发明的,CAN总线的历史,CAN总线的发展,CAN总线的应用场合,这些,通通不说.这里只是以我个人理解,简单说说CAN通信.CAN总线的端点没有地址(除非 ...
- (二十四)mongodb中group的问题二
今天的工作还是继续昨天没有完成的,由于对mongodb数据库的不熟悉,导致昨天的思路上也出了一点问题,我需要查询出同一个ruleID中不同的processingID的条数,然后根据条数来排列先后顺序, ...
- RTP、RTCP、RTSP 概念
用一句简单的话总结:RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制.同步. 之所以以前对这几个有点分不清,是因为CTC标准里没有对RTCP进行要求,因此在标准RTSP的代码 ...
- 用vlc搭建简单流媒体服务器(UDP和TCP方式)
.UDP(legacy)传统模式 .RTP方式 .RTSP方式 RTSP方式是通过RTP进行流媒体数据的传输的,VLC的实现也是基于UDP的.这种方式网上的参考资料比较多,我就不截图了,直接叙述命令行 ...