c# in deep 之委托
通俗来讲,委托就是吩咐别人去做某件事,但不知道他具体会怎么做。使用委托必须注意的一个问题是内存泄露问题:假如委托实例本身不能被回收,委托实例会阻止他的目标被作为垃圾回收。尤其是假如某“短命”的对象调用了一个“长命”的对象中的事件,并用其自身作为目标。“长命”对象间接容纳了对“短命”对象的引用,延长了“短命”对象的寿命。下面是一个只为委托而委托的例子:
delegate void StringProgressor(string input); //声明委托类型
class Person
{
string name;
public Person(string name) { this.name = name; }
public void Say(string message) //声明兼容的实例方法
{
Console.WriteLine("{0} says {1}",name,message);
}
}
class Background
{
public static void Note(string note) //声明兼容的静态方法
{
Console.WriteLine("({0})",note);
}
}
class Program
{
static void Main()
{
Person jon = new Person("Jon");
Person tom = new Person("Tom");
StringProgressor jonsVoice, tomsVoice, background;//创建三个委托实例
jonsVoice = new StringProgressor(jon.Say);
tomsVoice = new StringProgressor(tom.Say);
background = new StringProgressor(Background.Note);
jonsVoice("Hello son."); //隐式调用委托实例
tomsVoice.Invoke("Hello Daddy"); //显式调用委托实例
background("An airplane flies past");
Console.ReadKey();
}
}
委托的实质是间接完成某种操作,这样做增大了代码的复杂性,但提高了代码的灵活性。在真正使用时,委托实例实际上有一个操作列表与之关联,称为委托实例的调用列表。其中Combine(+=)和Remove(-=)负责添加和删除。在委托实例被调用时,所有操作都按顺序执行,如果其有一个非void的返回值,则Invoke的返回值是最后一个操作返回值,假如有一个操作抛出异常,则后面的操作都会被停止。
c# in deep 之委托的更多相关文章
- 【C#】委托的发展
"用事件去处理程序, 进而解决问题" ---- 委托的目的 委托早在C#2的时候就已经初具模型, 但是并不是特别灵活, 制止C#3才在代码中被广泛使用. C#4中泛型委托, C#5 ...
- 深度自适应增量学习(Incremental Learning Through Deep Adaptation)
深度自适应增量学习(Incremental Learning Through Deep Adaptation) 2018-05-25 18:56:00 木呆呆瓶子 阅读数 10564 收藏 更多 分 ...
- Rainbow: Combining Improvements in Deep Reinforcement Learning
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1710.02298v1 [cs.AI] 6 Oct 2017 (AAAI 2018) Abstract 深度强化学习社区对D ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- C#基础篇 - 理解委托和事件
1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- [C#] C# 知识回顾 - 委托 delegate
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
- 9、委托、事件、Lambda
开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.) 第 ...
- iOS 委托与文本输入(内容根据iOS编程编写)
文本框(UITextField) 本章节继续编辑 JXHypnoNerd .文件地址 . 首先我们继续编辑 JXHypnosisViewController.m 修改 loadView 方法,向 ...
随机推荐
- ORA-07445: :一个意料之外的问题发生了 核心转储 [ldxsnf()+625] [SIGSEGV
ALERT登录错误消息: Mon Jan 20 15:03:22 2014 Incremental checkpoint up to RBA [0x442f.abd.0], current log t ...
- maven 编
Eclipse 对 run as [Run Configurations] main标签. Goals:输入命令:clean install -Dmaven.test.skip=tru ...
- cocos2d0基础知识三个音符
1.触摸屏事件: bool HelloWorld::init() { //省略的代码的最后位 this->schedule(schedule_selector(HelloWorld::usecr ...
- [ACM] hdu 1285 确定比赛 (拓扑排序)
确定比赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 利用缓存、Timer间隔时间发送微信的实例,很有用的例子
//Class WechatOfferExcutor 此类为微信触发类,属于上层调用类,其中有用到用静态变量缓存offer信息,Task异步执行发送方法等 using Newtonsoft.Json. ...
- Java EE (1) -- Java EE 6 Web Component Developer Certified Expert(1z0-899)
1: hash map, hash tables 的区别 The HashMap class is roughly equivalent to Hashtable, except that it is ...
- UVA Don't Get Rooked
主题如以下: Don't Get Rooked In chess, the rook is a piece that can move any number of squaresverticall ...
- Cgroup maintainer丽泽范:解剖Linux核心容器技术
摘要:Cgroup和namespace等内核特性如何出现,在社区处于如何的开发状况?Docker如火如荼.内核社区是否会因此加紧完好容器技术的隔离性安全性?华为Linux内核高级project师李泽帆 ...
- Linux通过编辑器vi使用介绍
vi编辑器是所有Unix和Linux在标准的编辑系统. 对Unix和Linux该系统无论是什么版本号,vi编辑器是完全一样. 基本上vi它可分为三种状态,每一个是命令模式(commandmode).插 ...
- ASP.NET学习笔记2--自己写代码绑定Gridview
像以前一样,先写好自己的样式布局, 第二步,在数据库建立一个商品表 代码如下: CREATE TABLE [SHANGPING_INFO] ( [Shangping_Id] INT PRIMARY K ...