委托是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. json工具--org.json.jar

    org.json可以解析json.把对象包装成json.API文档:http://resources.arcgis.com/en/help/arcobjects-java/api/arcobjects ...

  2. IDEA字节码学习查看神器jclasslib bytecode viewer介绍

    转载来自:https://blog.csdn.net/w605283073/article/details/103209221 一.背景 很多人想学习Java反汇编后的字节码,但是一方面缺乏好的资料, ...

  3. SSM 的 基本原理与面试相关

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.MyBatis 1.Mybatis出现最多的问题是什么? 问题: 在XML配置文件中语句的书写与对象 ...

  4. Java实现蓝桥杯 算法提高 线段和点

    算法提高 线段和点 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 有n个点和m个区间,点和区间的端点全部是整数,对于点a和区间[b,c],若a>=b且a<=c,称点a满 ...

  5. Java实现 蓝桥杯 历届试题 核桃的数量

    历届试题 核桃的数量 时间限制:1.0s 内存限制:256.0MB 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的 ...

  6. Java实现 LeetCode 324 摆动排序 II

    324. 摆动排序 II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]- 的顺序. 示例 1: 输入: n ...

  7. 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)

    1.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Servi ...

  8. android-sdk-window的环境搭建以及appium简单录制脚本的使用

    大家好,今天给大家带来的是appium的环境搭建以及简单的录制脚本,自学的过程中入了不少坑,下面给大家开始分享! 使用Appium录制脚本必备三大金刚:Appium-desktop(至于为什么用这个, ...

  9. PAT1040 Longest Symmetric String (25分) 中心扩展法+动态规划

    题目 Given a string, you are supposed to output the length of the longest symmetric sub-string. For ex ...

  10. DBusConnection for c

    dbus的C API D-Bus 1.13.10 目录 dbus的C API Detailed Description Typedef Documentation ◆ DBusAddTimeoutFu ...