委托是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#委托的更多相关文章

  1. [转帖]10分钟看懂Docker和K8S

    10分钟看懂Docker和K8S https://zhuanlan.zhihu.com/p/53260098 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这 ...

  2. 十分钟看懂AES加密

    十分钟看懂AES加密算法 今天看了Moserware的<A Stick Figure Guide to the Advanced Encryption Standard(AES)>收获了不 ...

  3. 5分钟看懂Code128条形码

    什么是Code128条形码? 相信大家看到这个都不陌生吧 1.前言 条形码种类很多,常见的大概有二十多种码制,其中包括:Code39码(标准39码).Codabar码(库德巴码).Code25码(标准 ...

  4. 10分钟看懂Docker和K8S

    本文来源:鲜枣课堂 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的 ...

  5. 十分钟看懂,未来Web前端开发最新趋势

    首先,展望未来趋势我们就要弄懂过去的一年,也就是18年,web前端开发的重要新闻.重要事件和JavaScript的各种流行框架.模式发展趋势. 我们来快速回顾一下. NPM热门前端框架下载 先来看最热 ...

  6. 干货满满!10分钟看懂Docker和K8S(转)

    2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC,就是Linux容器虚 ...

  7. 干货满满!10分钟看懂Docker和K8S

    2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC,就是Linux容器虚 ...

  8. 10 分钟看懂 Docker 和 K8S!

    2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC, ...

  9. 五分钟看懂js关键字this

    this是js里面很常用的关键字,而灵活的js也赋予了这个关键字无穷的生命力,相信你也有被它糊弄的时候,我总结了一个6字原则,大部分场合都能清醒分辨this到底指向who,跟大家分享一下,欢迎指正. ...

随机推荐

  1. Python--numpy中的tile()函数

    首先是官方给的定以(我是用的VsCode,鼠标放置在tile上出现的),建议直接看后面的示例.   def tile(A, reps) Construct an array by repeating ...

  2. python脚本:在Ubuntu16系统上基于xtrabackup2.4和mysql5.7实现数据库数据的自动化备份和恢复,亲测有效!

    1 安装教程 官网安装教程:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/apt_repo.html -------- ...

  3. Chisel3 - model - Builder

    https://mp.weixin.qq.com/s/THqyhoLbbuXXAtdQXRQDdA   介绍构建硬件模型的Builder.   1. DynamicContext   ​​ 动态上下文 ...

  4. Java 第十一届 蓝桥杯 省模拟赛 洁净数

    洁净数 小明非常不喜欢数字 2,包括那些数位上包含数字 2 的数.如果一个数的数位不包含数字 2,小明将它称为洁净数. 请问在整数 1 至 n 中,洁净数有多少个? 输入格式 输入的第一行包含一个整数 ...

  5. Java实现 LeetCode 633 平方数之和(暴力大法)

    633. 平方数之和 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 ...

  6. Java实现 蓝桥杯VIP 算法训练 字符删除

    算法训练 字符删除 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,先输入一个字符串str(长度不超过20),再输入单独的一个字符ch,然后程序会把字符串str当中出现的所有的c ...

  7. Java实现 LeetCode 89 格雷编码

    89. 格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 示例 1: 输 ...

  8. Java实现 蓝桥杯VIP 算法提高 棋盘多项式

      算法提高 棋盘多项式   时间限制:1.0s   内存限制:256.0MB 棋盘多项式 问题描述 八皇后问题是在棋盘上放皇后,互相不攻击,求方案.变换一下棋子,还可以有八车问题,八马问题,八兵问题 ...

  9. 第四届蓝桥杯C++B组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.猜灯谜 A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的 ...

  10. java实现奇怪的比赛

    ** 奇怪的比赛** 某电视台举办了低碳生活大奖赛.题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度.答对的,当前分数翻倍:答错了则扣掉与题号相同的分数(选手必 ...