学习《深入理解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基础知识笔 ...
随机推荐
- Zoie中文文档及简单解析
https://linkedin.jira.com/wiki/pages/viewpage.action?pageId=4456480 一.总体架构 Zoie是一个实时的搜索引擎系统,其需要逻辑上独立 ...
- 用lambda表达式树替代反射
本节重点不讲反射机制,而是讲lambda表达式树来替代反射中常用的获取属性和方法,来达到相同的效果但却比反射高效. 每个人都知道,用反射调用一个方法或者对属性执行SetValue和GetValue操作 ...
- 使用Topshelf创建Windows服务(转)
Calculator public class Calculator : ICalculator { public Calculator() { Logger = LogManager.GetCurr ...
- plink参数说明
Plink: command-line connection utilityRelease 0.67Usage: plink [options] [user@]host [command] ...
- (oneway void) release中oneway的意思
oneway is used with the distributed objects API, which allows use of objective-c objects between dif ...
- print()函数的end 参数
print()函数含end参数时:结束的时候已什么结尾,后面的参数可以是任何形式 [print() 默认以'\n' 结尾] 输出结果: print()函数不含end参数时: 输出结果:
- imooc 生鲜超市笔记
1.启动前端项目(Vue.js) cnpm run dev
- Ubuntu安装Nginx和正确卸载Nginx Nginx相关
1.Ubuntu下安装Nginx比较简单 敲入下列命令即可: sudo apt-get update sudo apt-get install nginx 2.Ubuntu下卸载,稍不注意就会入坑 s ...
- java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)
转载地址:http://www.devba.com/index.php/archives/4581.html java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明); ...
- php的json校验json-schema
客户端和服务端的http信息传递,采用json几乎成了标配.json格式简单,易于处理,不过由于没有格式规定,无法校验. 好在php有json-schema模块,可以用来验证json是否符合规定的格式 ...