目录

简单委托的构成

委托四部曲:

  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. phpredis中文手册——《redis中文手册》 php版(转)

    redis中文手册:http://readthedocs.org/docs/redis/en/latest/ 本文是参考<redis中文手册>,将示例代码用php来实现,注意php-red ...

  2. 【laravel54】查看版本号3种方式

    1:最简单的用命令行实现>进入项目目录,执行 > php artisan --version 2:查看文件 vendor\laravel\framework\src\Illuminate\ ...

  3. Ubuntu 12.04 安装 vsftpd

    本篇文章由:http://xinpure.com/ubuntu-12-04-install-vsftpd/ 安装背景 wordpress 在线升级需要配置 ftp 帐号,之前用的是虚拟主机,都是带有 ...

  4. 无法启动此程序因为计算机中丢失 xxx.dll

    “无法启动此程序因为计算机中丢失 XXX.dll” 这类问题在 visual studio 中很常见… 许久不和VS打交道,一碰各种坑… 这是在 VS 2015 Community 出现的问题: (1 ...

  5. jQuery ajax 流程全解析

    实例解析java + jQuery + json工作过程(登录) 本文主要讲解在java环境下使用jQuery进行JSON数据传送的交互过程 参考根据作者的账务管理系统(个人版) 源码下载 讲解 一. ...

  6. CSS的width:100%和width:auto区别

    CSS的width:100%和width:auto区别 一.   问题 前段时间在调整树结构的时候,发现如果树的节点名称比较长的话在IE6下则不会撑开外面的元素,导致节点的名称只显示了一半,同时图标和 ...

  7. map 类简介和例程

    一.标准库的map类型 使用map得包含map类所在的头文件 template < class Key, class Type, class Traits = less<Key>, ...

  8. 利用国内的源安装 Python第三方库

    我们需要安装一些Python的第三方库,但是使用  pip install + 第三方库  的时候,会出现下载速度慢的问题,当然我们也可以使用国内的源安装. 例如: sudo pip install ...

  9. jqury插件编写

    sae中短信验证码: ; (function($) { $(document).ready(function() { if (parent && parent.location.hre ...

  10. C union共用体

    共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型.您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值.共用体提供了一种使用相同的内存位置的有效方式. 共用体定义: ...