C# 委托(Delegate)
什么是委托
委托跟类一样,是用户自定义的类型。但类是表示数据的集合,委托是具有兼容返回类型和输入参数的方法或lambda表达式的集合。
如果你学过C++,那么可以把委托理解为指向函数的指针。但是,委托是类型安全和可靠的。
你可以把委托看做一个包含有【有序方法列表】的对象。这些方法具有相同的返回类型和签名(参数列表,包括ref和out修饰符)。
在调用委托时,会执行【有序方法列表】的所有方法。
委托的使用
声明委托类型
delegate <return type> <delegate-name> <parameter list>
e.g.
delegate void Mydel(int x);
1
2
3
创建委托对象
//变量声明
Mydel delVaer;
//使用带new运算符的对象创建表达式
delVar = new MyDel(Method1);
//快捷语法
delVar = Method1;
//当然也可以把创建变量初始化放在一起
Mydel delVar = new MyDel(Method1);
Mydel delVar = Method1;
**委托是引用类型**
1
2
3
4
5
6
7
8
9
10
11
12
组合委托
MyDel delA = Method1;
MyDel delB = Mythod2;
MyDel delC = delA + delB;
//delC的方法列表是delA和delB的方法列表的组合
1
2
3
4
为委托增加方法
Mydel del = Method1;
del += Method2;
del += Method3;
//委托是不可变的,所以实际发生的是创建了一个新委托,其调用列表是旧委托列表和方法的组合,然后这个新的委托赋值给del
1
2
3
4
从委托移除方法
del -= Method1;
//和增加方法一样,这里实际发生的是创建了一个新的委托
1
2
需要注意的是:
1. 删除的过程是从列表的最后开始搜索,并且移除第一个匹配的放法。
2. 试图删除委托中不存在的放法没有效果
3. 试图调用空委托会发生异常
4. 如果委托的调用列表为空,则委托是null
调用委托
可以像调用方法一样调用委托,委托的参数会用于方法列表的所有方法(除非有一个参数是输出参数)。
Mydel del = Method1;
del += Method2;
del += Method3;
del();//调用委托
1
2
3
4
调用带返回参数的委托
如果委托有返回值并且在调用列表中有一个以上的方法,会发生下面的情况:
调用列表最后一个方法的返回值就是委托的返回值
调用列表中其他方法的返回值都会被忽略
调用带引用参数的委托
匿名方法
delegate int Mydel(int x);
Mydel del = delegate (int x){return x+1;}
1
2
emmm,就是没有名字的方法。
语法:
delegate (Parameters){ ImplementationCode }
1
返回类型:匿名方法不会显式的声明返回类型,但其返回类型必须与对应的委托相一致
参数:必须与委托一致。需要注意的是,委托中的params关键字会被匿名方法忽略。
被捕获变量的生命周期会拓展。
delegate void Mydel();
static void Main(){
Mydel del;
{
int x = 5;//对匿名函数而言是外部变量
del = delegate(){
Console.WriteLine(x);//x被捕获
}
}
Console.WriteLine(x);//报错,未定义x
if (del != null){
del();//输出x的值
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Lamabda表达式
emmm,跟匿名函数一样是为了方便。其实,如果lambda表达式如果被先引进,就不会有匿名函数了。
Mydel del = delegate(int x) {return x+1;}
Mydel del = (int x)=>{return x+1;}
Mydel del = (x)=>{return x+1}//可以省略类型
Mydel del = x =>{return x+1}//如果只有一个参数可以省略()
Mydel del = x => x+1//若果语句块只包含一个返回语句,则可以把语句块替换为return后的表达式
1
2
3
4
5
lambda表达式要点:
1. lambda表达式参数列表中的参数必须在类型、数量和位置上与委托相匹配
2. 参数类型可以省略(隐式类型)。除非委托中有ref或者out参数—此时类型是必须的。
3. 如果只有一个参数并且是隐式的,则可以省略(),否则()是必须的
4. 如果没有参数,必须使用()
---------------------
作者:guojunxiu
来源:CSDN
原文:https://blog.csdn.net/guojunxiu/article/details/81010849
版权声明:本文为博主原创文章,转载请附上博文链接!
C# 委托(Delegate)相关推荐
- C# 委托(Delegate) 事件(Event)应用详解
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...
- C#委托(delegate、Action、Func、predicate)和事件
C#委托(delegate.Action.Func.predicate)和事件 - 园子的蜗牛 - 博客园 C#之委托 - 摸鱼王 - 博客园 C++函数指针与C#委托之间有何联系 - 51CTO.C ...
- C#-----委托delegate的定义与使用
委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法 委托的声明: delegate <函数返回类型> <委托名> (<函数参数>) //声明委托 del ...
- C#基础知识学习之 ✨ “精神小伙“——委托(delegate) 的含义和用法
C#委托(Delegate) 在C#的学习过程中,自然有我们的精神小伙--委托 的一席之地 本文就介绍一下C#中的委托,这位可以包含同类方法函数的小伙子 C# 中的委托(Delegate)类似于 C ...
- 理解委托(delegate)及为什么要使用委托
委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来比较难,举个生活中的例子: 某人有三子,让他们各 ...
- 异步使用委托delegate --- BeginInvoke和EndInvoke方法
当我们定义一个委托的时候,一般语言运行时会自动帮委托定义BeginInvoke 和 EndInvoke两个方法,这两个方法的作用是可以异步调用委托. 方法BeginInvoke有两个参数: Async ...
- 跟小静学CLR via C#(12)-委托Delegate
本来按照进度应该学习事件了,可总觉得应该委托在前,事件在后,才好理解. 委托是一个类,它提供了回调函数机制,而且是类型安全的.使用委托可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数 ...
- jquery-事件委托-delegate
代理的使用 如果希望某个成员绑定某个事件,例如li标签编定click事件 期望新进来的li也能得到这个事件 可以通过事件委托来实现 事件委托的格式 父级标签对象.delegate(str子级标签选择器 ...
- lambda表达式不使用委托(delegate) 用FUNC
lLambda不使用delegate关键字,而使用 Lambda运算符 => goes to l 1.Func<int,string> getInput = (int age ...
- unity学习-委托(delegate),事件(event),Action,Func
unity学习 委托 含义 定义 使用 事件 含义 使用 在进行项目的过程中,一直存在着对代码管理不当的问题,所以需要学习一些科学的代码思维,减少后期功能的修改与迭代引发的代码冗杂和内存爆炸 可以看b ...
最新文章
- 关于STL 容器的嵌套使用, 小试牛刀
- c语言24点程序,C语言24点问题
- 如何在Windows上使用64位Web浏览器
- 【决策单调性】玩具装箱(金牌导航 决策单调性优化DP-1)
- uva 10883——Supermean
- JavaScript面向对象--继承 (超简单易懂,小白专属)...
- 表空间(tableSpace) 段(segment) 盘区(extent) 块(block) 关系
- linux复制内容的快捷键,Linux复制粘贴快捷键
- C#6.0 十大常用特性
- 大数据架构师工作内容有哪些?
- PB级(大数据)的来源
- mysql inner 连接多表_MySQL数据库之多表查询inner join内连接
- 阿里巴巴代码规范插件
- wifi mesh测试软件,「可能是」最适合我的Mesh+WiFi6方案:Linksys Velop MX10600体验分享...
- java正则表达式yyyymmdd_日期正则表达式yyyyMMdd
- 线性代数之——复数矩阵
- python123第三次作业的解答
- 腾讯java校招,09.26 腾讯校招前端一面经历
- 怎样从电脑传入视频到ipad 播放
- 零基础如何学习JAVA编程开发