目录

简单委托的构成

委托四部曲:

  1. 声明委托类型。
  2. 必须有一个方法包含了要执行的方法。
  3. 必须创建一个委托实例。
  4. 必须调用委托(invoke)实例

① 声明委托

 public delegate void SayHelloWorld(string message);  //① 声明委托类型

如上,声明了一个SayHelloWorld的委托类型, 由System.MulticastDelegate派生,而System.MulticastDelegate又派生自 System.Delegate 。与该类型匹配的方法的签名必需使用一个string类型作为参数和返回一个void类型(即没有返回值)。

②要执行的方法

public static void Say(string message) //② 必须有一个方法包含了要执行的代码;
{
Console.WriteLine(message);
}

方法可以是静态方法或者一个实例方法。

③ 必须创建一个委托实例

SayHelloWorld saymessage = new SayHelloWorld(Say);  //③ 必须创建一个委托实例

④ 调用(invoke)委托实例

 saymessage.Invoke("HelloWorld"); //④ 必须调用(invoke)委托实例

也可以saymessage("HelloWorld");

完整代码:

 public static class Program
{
public delegate void SayHelloWorld(string message); //① 声明委托类型
static void Main(string[] args)
{
SayHelloWorld saymessage = new SayHelloWorld(Say); //③ 必须创建一个委托实例
saymessage += SayName; //增加委托实例
saymessage.Invoke("HelloWorld"); //④ 必须调用(invoke)委托实例
saymessage -= Say; //删除委托实例
Console.WriteLine("这是一种调用方法:"); //返回委托的调用列表
System.Delegate[] delegates = saymessage.GetInvocationList();
//注意这里的delegates列表中存储的是SayHelloWorld类型的委托
Console.WriteLine("这是二种调用方法:");
foreach (SayHelloWorld say in delegates)
{
saymessage("HelloWorld");
}
Console.ReadKey();
}
public static void Say(string message) //② 必须有一个方法包含了要执行的代码;
{
Console.WriteLine(message);
}
public static void SayName(string name)
{
Console.WriteLine(name);
} }

合并和删除委托

委托实例不只有一个操作,但真实情况要稍微复杂一点,委托实例实际有一个操作列表与之关联。称之为委托实例列表。而我们一般用+=和-=操作符来对委托实例的增加和删除。调用委托实例时,它的所有操作都按顺序执行。如果委托的签名具有一个非 void 的返回类型,则 Invoke 的返回值是最后一个操作的返回值。很少有非 void 的委托实例在它的调用列表中指定多个操作,因为这意味着其他所有操作的返回值永远都看不见。除非每次调用代码使用Delegate.GetInvocationList 获取操作列表时,都显式调用某个委托。如果调用列表中的任何操作抛出一个异常,都会阻止执行后续的操作。

委托总结

  1. 委托封装了包含特殊返回值和一组参数行为,类似于单一方法接口。
  2. 委托类型声明中描述的类型签名决定了方法哪个方法可用于委托实例,同时也决定了调用签名。
  3. 创建委托实例,需要一个方法以及(对于实例方法来说)调用方法的目标。
  4. 委托实例是不易变的。
  5. 每个委托实例都包含一个调用列表——一个操作列表。
  6. 委托实例可以合并到一起,也可以从一个委托实例中删除另一个。

这篇就写到这里。下篇我们将继续学习《深入理解C#》的相关知识。谢谢!

学习《深入理解C#》—— 委托的构成、合并与删除和总结 (第二章1.1---1.4)的更多相关文章

  1. oracle学习 第二章 限制性查询和数据的排序 ——03

    这里.我们接着上一小节2.6留下的问题:假设要查询的字符串中含有"_"或"%".又该如何处理呢? 開始今天的学习. 2.7  怎样使用转义(escape)操作符 ...

  2. 深入理解Magento – 第二章 – Magento请求分发与控制器

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第二章 – Magento请求分发与控制器 Model-View-Controller (MVC) ,模型-视图- ...

  3. 学习和理解C#中的事件

    注:本文系学习笔记. 上一篇文章记录了我对C#中委托的理解.委托实际上是一种类型.可以将一个或多个方法绑定到委托上面,调用委托时,一次执行委托上面绑定的方法.本文要讲述的事件实际上和委托有很深的“感情 ...

  4. Git速成学习第三课:创建与合并分支

    本来第三课想记录一下远程仓库的创建与克隆0.0但是想了想还是不写了. 这里写一下分支管理中的创建与合并. Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng. ...

  5. ch01.深入理解C#委托及原理(转)

    ch01..深入理解C#委托及原理_<没有控件的ASPDONET> 一.委托 设想,如果我们写了一个厨师做菜方法用来做菜,里面有 拿菜.切菜.配菜.炒菜 四个环节,但编写此方法代码的人想让 ...

  6. SQL Server 学习博客分享列表(应用式学习 + 深入理解)

    SQL Server 学习博客分享列表(应用式学习 + 深入理解) 转自:https://blog.csdn.net/tianjing0805/article/details/75047574 SQL ...

  7. JDK学习---深入理解java中的HashMap、HashSet底层实现

    本文参考资料: 1.<大话数据结构> 2.http://www.cnblogs.com/dassmeta/p/5338955.html 3.http://www.cnblogs.com/d ...

  8. JDK学习---深入理解java中的LinkedList

    本文参考资料: 1.<大话数据结构> 2.http://blog.csdn.net/jzhf2012/article/details/8540543 3.http://blog.csdn. ...

  9. python基础知识的学习和理解

    参考链接:https://github.com/yanhualei/about_python/tree/master/python_learning/python_base   python基础知识笔 ...

随机推荐

  1. redhat6.2 系统中文环境改成英文环境

    暂时变为英文:export LANG=en_US.UTF-8 可以保证你暂时安装oracle没有问题,不出现框框.但是,要说彻底改为英语环境下的时候,用下面: export LANG=en_US就是改 ...

  2. Linux-软件包管理-rpm命令管理-查询

    rpm -q httpd 查看apache包是否已经安装 rpm -qa 查看所有已经安装的包rpm -qa | grep httpd 查询包含和apache关键字相关联的所有包信息 rpm -qi ...

  3. Mysql5.7的初始密码更改

    软件版本的变化真是让人兴奋…… Linux服务器决定安装使用mysql 5.7了. 愉快的去官网下载安装包:https://dev.mysql.com/downloads/mysql/ 解决完所有依赖 ...

  4. Mockito 相关资料

    https://monkeyisland.pl/2008/04/26/asking-and-telling/ http://qiuguo0205.iteye.com/blog/1456528 http ...

  5. OpenCV3+Python3

    OpenCV3计算机视觉Python语言实现笔记 图像处理与OpenCV Python3与OpenCV3.3 图像处理 OpenCV文摘 基于Python3 + OpenCV3.3.1的远程监控程序 ...

  6. html中iframe子页面与父页面元素的访问以及js变量的访问

    1.子页面访问父页面元素   parent.document.getElementById('id')和document相关的方法都可以这样用   2.父页面访问子页面元素   document.ge ...

  7. tracert路由跟踪工具使用方法

    1. 路由跟踪在线Tracert工具说明 Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径.Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP ...

  8. 每日英语:Online Education a New Frontier in China

    In a country as obsessed with education as China, it makes sense that online teaching has huge poten ...

  9. ubutun:从共享文件夹拷贝文件尽量使用cp命令而不是CTRL+C/V

    为了方便,VBOX安装的Ubuntu,并在硬盘上创建了一个与Windows的共享文件夹sharefolder方便在两个系统之间传文件 但是经常发现的问题就是从sharefolder中拷贝文件到ubun ...

  10. Error C2280

    原因:默认参数用的assignment,而不是reference,要知道ostream并没有实现copy constructor/assignment operator(通过bing.com搜索Err ...