3分钟看懂C#委托
委托是c#语言的一大亮点,最大的作用是让一个方法可以作为另一个方法的参数
下面是一个简单的示例
internal class Program
{
//使用delegate定义委托类型
private delegate void MyDelegate(int a, int b);
private static void Main()
{
//声明变量,实例化委托,传递的实例方法,也可以是静态类型
var d = new MyDelegate(new Program().Add);
//委托作为参数传给另一个方法
MyMethod(d);
Console.Read();
}
//方法定义要与委托定义相同,返回类型void,int类型参数
private void Add(int a, int b)
{
int sum = a + b;
Console.WriteLine(sum);
}
//方法参数是委托类型
private static void MyMethod(MyDelegate myDelegate)
{
//方法中调用委托
myDelegate(1, 2);
}
}
再来看看委托链,多个委托链接在一起就是委托链,使用 “+”链接委托,“-”移除委托
internal class Program
{
public delegate void MyDelegate();
private static void Main()
{
var d1 = new MyDelegate(Program.Method1);
var d2 = new MyDelegate(new Program().Method2);
//定义一个委托对象
MyDelegate d = null;
//“+”链接委托,“-”移除委托,如d -= d2;
d += d1;
d += d2;
//调用委托链
d();
Console.Read();
}
private static void Method1()
{
Console.WriteLine("静态方法");
}
private void Method2()
{
Console.WriteLine("实例方法");
}
}
这时候再看官方文档 "如何合并委托(多播委托)(C# 编程指南)"就很容易理解了
// 定义委托
internal delegate void CustomDel(string s);
internal class TestClass
{
// 定义两个方法,方法定义要与委托定义相同,返回类型void,string类型参数
private static void Hello(string s)
{
Console.WriteLine($" Hello, {s}!");
}
private static void Goodbye(string s)
{
Console.WriteLine($" Goodbye, {s}!");
}
private static void Main()
{
// 定义委托实例
CustomDel hiDel, byeDel, multiDel, multiMinusHiDel;
// 如果想要省略定义委托,可以使用Action<string>替代
// 如 Action<string> hiDel, byeDel, multiDel, multiMinusHiDel;
// 引用方法Hello.
hiDel = Hello;
// 引用方法 Goodbye.
byeDel = Goodbye;
//“+” 链接两个委托形成委托链(多播委托)
multiDel = hiDel + byeDel;
//“-” 从委托链中移除委托
multiMinusHiDel = multiDel - hiDel;
Console.WriteLine("Invoking delegate hiDel:");
hiDel("A");
Console.WriteLine("Invoking delegate byeDel:");
byeDel("B");
Console.WriteLine("Invoking delegate multiDel:");
multiDel("C");
Console.WriteLine("Invoking delegate multiMinusHiDel:");
multiMinusHiDel("D");
}
}
/* 输出:
Invoking delegate hiDel:
Hello, A!
Invoking delegate byeDel:
Goodbye, B!
Invoking delegate multiDel:
Hello, C!
Goodbye, C!
Invoking delegate multiMinusHiDel:
Goodbye, D!
*/
(PS:委托的本质是一个类)
3分钟看懂C#委托的更多相关文章
- [转帖]10分钟看懂Docker和K8S
10分钟看懂Docker和K8S https://zhuanlan.zhihu.com/p/53260098 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这 ...
- 十分钟看懂AES加密
十分钟看懂AES加密算法 今天看了Moserware的<A Stick Figure Guide to the Advanced Encryption Standard(AES)>收获了不 ...
- 5分钟看懂Code128条形码
什么是Code128条形码? 相信大家看到这个都不陌生吧 1.前言 条形码种类很多,常见的大概有二十多种码制,其中包括:Code39码(标准39码).Codabar码(库德巴码).Code25码(标准 ...
- 10分钟看懂Docker和K8S
本文来源:鲜枣课堂 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的 ...
- 十分钟看懂,未来Web前端开发最新趋势
首先,展望未来趋势我们就要弄懂过去的一年,也就是18年,web前端开发的重要新闻.重要事件和JavaScript的各种流行框架.模式发展趋势. 我们来快速回顾一下. NPM热门前端框架下载 先来看最热 ...
- 干货满满!10分钟看懂Docker和K8S(转)
2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC,就是Linux容器虚 ...
- 干货满满!10分钟看懂Docker和K8S
2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC,就是Linux容器虚 ...
- 10 分钟看懂 Docker 和 K8S!
2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC, ...
- 五分钟看懂js关键字this
this是js里面很常用的关键字,而灵活的js也赋予了这个关键字无穷的生命力,相信你也有被它糊弄的时候,我总结了一个6字原则,大部分场合都能清醒分辨this到底指向who,跟大家分享一下,欢迎指正. ...
随机推荐
- DQN(Deep Q-learning)入门教程(四)之Q-learning Play Flappy Bird
在上一篇博客中,我们详细的对Q-learning的算法流程进行了介绍.同时我们使用了\(\epsilon-贪婪法\)防止陷入局部最优. 那么我们可以想一下,最后我们得到的结果是什么样的呢?因为我们考虑 ...
- java方式实现选择排序
一.基本思想 每一趟找到未排序序列的最小(大)值,把它存放在已排序序列末尾,直到把所有的数据排序完,即是第k趟找到剩余未排序数据的最小(大)值,然后把这个最小(大)值存放在数组的第k(k=1,2... ...
- jQuery-操作元素的内容,属性,样式
1.操作内容 获取: 双标签:html() input:val() 设置: 双标签:html('新内容') input:val('新内容') 2.操作属性 * 获取:attr('属性名') * 设置: ...
- Rocket - util - Timer
https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A 简单介绍Timer的实现. 1. 基本功能 实现定时器的功能. 2. Ti ...
- 题解 CF1348D 【Phoenix and Science】
题目大意,每天细菌会在早上选择分裂,晚上生长. 观察题目,我们可以发现.不管我们怎么分裂细菌,这一天晚上的总质量都是前一天晚上的总质量加上今天的细菌数. 那么我们肯定希望细菌分裂的越多越好,这样我们减 ...
- XStream学习手册
一.前言 1.XStream官网 http://x-stream.github.io 2.XStream是什么 XStream是一个简单的基于Java的类库,用来将Java对象序列化成XML(J ...
- Java实现 LeetCode 212 单词搜索 II
public class Find2 { public int[] dx={1,-1,0,0}; public int[] dy={0,0,1,-1}; class Trie{ Trie[] trie ...
- java实现 洛谷 P1017 进制转换
import java.util.Scanner; public class Main { private static Scanner cin; public static void main(St ...
- java实现第五届蓝桥杯排列序数
排列序数 如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号: abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bac ...
- jQuery实现打飞机游戏
玩法介绍:不同样式的飞机出来其它飞机会暂停飞行且处于无敌状态,子弹对它无效,你操纵的飞机不能碰到任何飞机,发出的子弹可以攻击正在飞行的飞机,每击落一架飞机会记录分数,你操纵的飞机碰到其它飞机即为游戏结 ...