学习《深入理解C#》—— 委托的构成、合并与删除和总结 (第二章1.1---1.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 获取操作列表时,都显式调用某个委托。如果调用列表中的任何操作抛出一个异常,都会阻止执行后续的操作。
委托总结
- 委托封装了包含特殊返回值和一组参数行为,类似于单一方法接口。
- 委托类型声明中描述的类型签名决定了方法哪个方法可用于委托实例,同时也决定了调用签名。
- 创建委托实例,需要一个方法以及(对于实例方法来说)调用方法的目标。
- 委托实例是不易变的。
- 每个委托实例都包含一个调用列表——一个操作列表。
- 委托实例可以合并到一起,也可以从一个委托实例中删除另一个。
这篇就写到这里。下篇我们将继续学习《深入理解C#》的相关知识。谢谢!
学习《深入理解C#》—— 委托的构成、合并与删除和总结 (第二章1.1---1.4)的更多相关文章
- oracle学习 第二章 限制性查询和数据的排序 ——03
这里.我们接着上一小节2.6留下的问题:假设要查询的字符串中含有"_"或"%".又该如何处理呢? 開始今天的学习. 2.7 怎样使用转义(escape)操作符 ...
- 深入理解Magento – 第二章 – Magento请求分发与控制器
深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第二章 – Magento请求分发与控制器 Model-View-Controller (MVC) ,模型-视图- ...
- 学习和理解C#中的事件
注:本文系学习笔记. 上一篇文章记录了我对C#中委托的理解.委托实际上是一种类型.可以将一个或多个方法绑定到委托上面,调用委托时,一次执行委托上面绑定的方法.本文要讲述的事件实际上和委托有很深的“感情 ...
- Git速成学习第三课:创建与合并分支
本来第三课想记录一下远程仓库的创建与克隆0.0但是想了想还是不写了. 这里写一下分支管理中的创建与合并. Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng. ...
- ch01.深入理解C#委托及原理(转)
ch01..深入理解C#委托及原理_<没有控件的ASPDONET> 一.委托 设想,如果我们写了一个厨师做菜方法用来做菜,里面有 拿菜.切菜.配菜.炒菜 四个环节,但编写此方法代码的人想让 ...
- SQL Server 学习博客分享列表(应用式学习 + 深入理解)
SQL Server 学习博客分享列表(应用式学习 + 深入理解) 转自:https://blog.csdn.net/tianjing0805/article/details/75047574 SQL ...
- JDK学习---深入理解java中的HashMap、HashSet底层实现
本文参考资料: 1.<大话数据结构> 2.http://www.cnblogs.com/dassmeta/p/5338955.html 3.http://www.cnblogs.com/d ...
- JDK学习---深入理解java中的LinkedList
本文参考资料: 1.<大话数据结构> 2.http://blog.csdn.net/jzhf2012/article/details/8540543 3.http://blog.csdn. ...
- python基础知识的学习和理解
参考链接:https://github.com/yanhualei/about_python/tree/master/python_learning/python_base python基础知识笔 ...
随机推荐
- Linux命令-帮助命令:man
man ls 查看ls命令的帮助信息(输出结果和less命令一样,需要空格,回车,,上箭头,下箭头,PgUp,PgDn,q等方式浏览) 注意:由于这个文件信息量比较大,需要查找某一个字符,输入/,输入 ...
- android中文字中间有超链接的实现方法
1.XML里写: <resources> <string name="ACCOUNT_REGISTER_PROMPT_AGREEMENT">点击注册,表 ...
- Scrapy见面第五天
这算是我第一次使用框架吧,说来羞愧. 此前用Request带上cookie实现.(略微)完好了QQ空间的爬虫(传送门),接下来想实现分布式去爬. 事实上仅仅要能实现待爬QQ队列的共享,分布式的主要问题 ...
- Mybatis自动生成的配置实例
一.目录 按照图片准备下面的东西吧,基础jar,数据链接库的jar. 二.generatorConfig.xml <?xml version="1.0" encoding=& ...
- Python 爬虫实例(2)—— 爬取今日头条
# coding:utf-8 import base64 import random, re import sqlite3 import redis, pickle import json, time ...
- PHP设计模式系列 - 观察者模式处理订单(异步操作附加功能)
观察者模式 观察者设计模式能够更便利创建和查看目标对象状态的对象,并且提供和核心对象非耦合的置顶功能性.观察者设计模式非常常用,在一般复杂的WEB系统中,观察者模式可以帮你减轻代码设计的压力,降低代码 ...
- 用React Native编写跨平台APP
用React Native编写跨平台APP React Native 是一个编写iOS与Android平台实时.原生组件渲染的应用程序的框架.它基于React,Facebook的JavaScript的 ...
- 每日英语:Dishing the Dirt on Hand-Washing Guidelines
Americans aren't washing their hands nearly as often and as thoroughly as they should, according to ...
- iPhone应用程序的启动过程
Phone的入口函数main,这之后它有是怎样启动应用程序,初始化的呢,这些都是通过 UIApplicationMain 来实现的. 其启动的流程图大致如下图所示: 1 int retVal = UI ...
- js控制伪元素样式
//获取伪元素// CSS代码 #myId:before { content: "hello world!"; display: block; width: 100px; heig ...