C# in depth 阅读笔记-- 委托
委托(delegate)
1. 相当于C语言的函数指针,执行委托,就是执行相应代理的方法.
2. 使用委托的步骤
a. 声明委托类型(delegate)
委托的签名决定了委托可以代理的方法的类型,方法的签名要去委托的签名一致
例:delegate void StringProcessor (string input);
b. 定义要执行的方法
以下5个方法中,只有第1个跟最后一个方法的签名与委托一致,才可以被委托调用。
void PrintString (string x)
void PrintInteger (int x)
void PrintTwoStrings (string x, string y)
int GetStringLength (string x) //返回值不一样也不行
void PrintObject (object x) //object是string的基类
c. 创建委托对象
StringProcessor proc1, proc2;
proc1 = new StringProcessor(StaticMethods.PrintString); //指向一类方法
InstanceMethods instance = new InstanceMethods();
proc2 = new StringProcessor(instance.PrintString); //指向一实例方法
d. 调用执行委托对象
每个委托对象都有个Invoke(参数)方法去执行委托,但是也可以把委托对象就看作是个方法,直接执行
3. 示例
using System;
delegate void StringProcessor(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 SimpleDelegateUse
{
static void Main()
{
Person jon = new Person("Jon");
Person tom = new Person("Tom");
StringProcessor jonsVoice, tomsVoice, background;
jonsVoice = new StringProcessor(jon.Say);
tomsVoice = new StringProcessor(tom.Say);
background = new StringProcessor(Background.Note);
jonsVoice("Hello, son.");
tomsVoice.Invoke("Hello, Daddy!");
background("An airplane flies past.");
}
}
4. 委托的合并与删除(Combining and removing delegates)
一个委托可以代理一个方法,其实也可以代理很多的方法,通过合并操作,可以合并多个委托构成一个 代理列表(invocation list), 这样执行该委托就可以执行列表里的一序列方法。同理,可以从这个列表里删除某一委托,就是删除代理的某一方法。
委托具有不变性,跟字符串的不变性一样,一旦创建了个委托对象就不可改变该委托,委托的合并与删除都会返回一个新的委托
合并的方法: Delegate.Combine(x,y) 简写 + 或 +=
删除的方法: Delegate.Remove(source,value) 简写 - 或 -=
2
3namespace Test
4{
5 delegate void Action();
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 Action x = new Action(OutputOne);
11 Action y = new Action(OutputTwo);
12
13 //委托的合并
14 Console.WriteLine("委托的合并");
15 x += y;
16 x();
17 Console.WriteLine();
18
19 //委托的删除
20 Console.WriteLine("委托的删除");
21 x -= y;
22 x();
23
24 }
25
26 static void OutputOne()
27 {
28 Console.WriteLine("输出X");
29 }
30
31 static void OutputTwo()
32 {
33 Console.WriteLine("输出Y");
34 }
35 }
36}
37
5. 委托一般不单独使用,一般用在事件里
事件并不是委托的实例,是Add/Remove方法对,相当于属性的getters/settters
转载于:https://www.cnblogs.com/coolface/archive/2008/07/11/1240709.html
C# in depth 阅读笔记-- 委托相关推荐
- 论文阅读笔记--Aesthetics-Driven Stereoscopic 3-D Image Recomposition With Depth Adaptation-2018
论文阅读笔记:美学引导的带有深度适应的立体3D图像重构 I.介绍 II.相关工作 A.单目(2D)图像处理 1)美学驱动的重构(Recomposition) 2)图像分割与抠图(Segment and ...
- 《Consistent Video Depth Estimation》阅读笔记
<Consistent Video Depth Estimation>阅读笔记 文章目录 <Consistent Video Depth Estimation>阅读笔记 前言: ...
- 【vn.py学习笔记(六)】vn.py constant源码阅读、委托生命周期
[vn.py学习笔记(六)]vn.py constant源码阅读.委托生命周期 写在前面 1 constant 1.1 Direction 1.2 Offset 1.3 Status 1.4 Prod ...
- Recurrence along Depth: Deep Convolutional Neural Networks with Recurrent Layer Aggregation阅读笔记
RLA阅读笔记 (一) Title (二) Summary (三) Research Object (四) Problem Statement (五) Method 5.1 Layer Aggrega ...
- DnCNN论文阅读笔记【MATLAB】
DnCNN论文阅读笔记 论文信息: 论文代码:https://github.com/cszn/DnCNN Abstract 提出网络:DnCNNs 关键技术: Residual learning an ...
- PointConv论文阅读笔记
PointConv论文阅读笔记 Abstract 本文发表于CVPR. 其主要内容正如标题,是提出了一个对点云进行卷积的Module,称为PointConv.由于点云的无序性和不规则性,因此应用卷积比 ...
- ResNet 论文阅读笔记
ResNet 论文阅读笔记 #机器学习/深度学习 文章介绍 论文地址:https://arxiv.org/pdf/1512.03385.pdf 原文题目:Deep Residual Learning ...
- 《Deep Learning for Computer Vision withPython》阅读笔记-PractitionerBundle(第9 - 11章)
9.使用HDF5和大数据集 到目前为止,在本书中,我们只使用了能够装入机器主存储器的数据集.对于小数据集来说,这是一个合理的假设--我们只需加载每一个单独的图像,对其进行预处理,并允许其通过我们的网络 ...
- CVPR2019|Depth-Aware Video Frame Interpolation【论文阅读笔记】
CVPR2019|Depth-Aware Video Frame Interpolation[论文阅读笔记] 作者 相关链接 1.前言 2.介绍 3.算法 4.实验 作者 Wenbo Bao, Wei ...
最新文章
- ​“后进生”数学学科上演完美逆袭,成最具竞争力专业之一
- 蚂蚁森林合种计划(2020.10.31,7天有效,每周更新)
- 在医疗领域你知道哪些人工智能黑科技?
- 关于iOS去除数组中重复数据的几种方法
- 在Win7中安装Oracle 10g时检测报错的解决办法
- golang select channel 多路复用
- 【聊透SpringMVC】java找不到指定文件
- 如何改变SQL SERVER的身份验证模式
- 【工作相关】公子龙:工作后我变强了,暂时没秃
- 腾讯研发效率领先的秘密:高效率的工具
- IDEA Maven项目左边栏只能看到pom文件
- element ui select 自动向上向下弹出_达观数据:Selenium使用技巧与机器人流程自动化实战...
- 疯狂连连看之开发游戏界面组件一
- 在页面加载完后执行javascript代码
- 工厂模式(Factory Method)
- 关于hash(一):基本概念
- 华为在线笔试题-python
- 计算机怎么知道乘法优先,计算器算个明白.doc
- 非线性回归-转化为线性回归以及非线性模型-用R语言实现
- iOS应用中crash 奔溃解析