委托(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)  简写 - 或 -=

 1using System;
 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 阅读笔记-- 委托相关推荐

  1. 论文阅读笔记--Aesthetics-Driven Stereoscopic 3-D Image Recomposition With Depth Adaptation-2018

    论文阅读笔记:美学引导的带有深度适应的立体3D图像重构 I.介绍 II.相关工作 A.单目(2D)图像处理 1)美学驱动的重构(Recomposition) 2)图像分割与抠图(Segment and ...

  2. 《Consistent Video Depth Estimation》阅读笔记

    <Consistent Video Depth Estimation>阅读笔记 文章目录 <Consistent Video Depth Estimation>阅读笔记 前言: ...

  3. 【vn.py学习笔记(六)】vn.py constant源码阅读、委托生命周期

    [vn.py学习笔记(六)]vn.py constant源码阅读.委托生命周期 写在前面 1 constant 1.1 Direction 1.2 Offset 1.3 Status 1.4 Prod ...

  4. Recurrence along Depth: Deep Convolutional Neural Networks with Recurrent Layer Aggregation阅读笔记

    RLA阅读笔记 (一) Title (二) Summary (三) Research Object (四) Problem Statement (五) Method 5.1 Layer Aggrega ...

  5. DnCNN论文阅读笔记【MATLAB】

    DnCNN论文阅读笔记 论文信息: 论文代码:https://github.com/cszn/DnCNN Abstract 提出网络:DnCNNs 关键技术: Residual learning an ...

  6. PointConv论文阅读笔记

    PointConv论文阅读笔记 Abstract 本文发表于CVPR. 其主要内容正如标题,是提出了一个对点云进行卷积的Module,称为PointConv.由于点云的无序性和不规则性,因此应用卷积比 ...

  7. ResNet 论文阅读笔记

    ResNet 论文阅读笔记 #机器学习/深度学习 文章介绍 论文地址:https://arxiv.org/pdf/1512.03385.pdf 原文题目:Deep Residual Learning ...

  8. 《Deep Learning for Computer Vision withPython》阅读笔记-PractitionerBundle(第9 - 11章)

    9.使用HDF5和大数据集 到目前为止,在本书中,我们只使用了能够装入机器主存储器的数据集.对于小数据集来说,这是一个合理的假设--我们只需加载每一个单独的图像,对其进行预处理,并允许其通过我们的网络 ...

  9. CVPR2019|Depth-Aware Video Frame Interpolation【论文阅读笔记】

    CVPR2019|Depth-Aware Video Frame Interpolation[论文阅读笔记] 作者 相关链接 1.前言 2.介绍 3.算法 4.实验 作者 Wenbo Bao, Wei ...

最新文章

  1. ​“后进生”数学学科上演完美逆袭,成最具竞争力专业之一
  2. 蚂蚁森林合种计划(2020.10.31,7天有效,每周更新)
  3. 在医疗领域你知道哪些人工智能黑科技?
  4. 关于iOS去除数组中重复数据的几种方法
  5. 在Win7中安装Oracle 10g时检测报错的解决办法
  6. golang select channel 多路复用
  7. 【聊透SpringMVC】java找不到指定文件
  8. 如何改变SQL SERVER的身份验证模式
  9. 【工作相关】公子龙:工作后我变强了,暂时没秃
  10. 腾讯研发效率领先的秘密:高效率的工具
  11. IDEA Maven项目左边栏只能看到pom文件
  12. element ui select 自动向上向下弹出_达观数据:Selenium使用技巧与机器人流程自动化实战...
  13. 疯狂连连看之开发游戏界面组件一
  14. 在页面加载完后执行javascript代码
  15. 工厂模式(Factory Method)
  16. 关于hash(一):基本概念
  17. 华为在线笔试题-python
  18. 计算机怎么知道乘法优先,计算器算个明白.doc
  19. 非线性回归-转化为线性回归以及非线性模型-用R语言实现
  20. iOS应用中crash 奔溃解析

热门文章

  1. 滴定数据处理结果分析
  2. 2021年春季学期-信号与系统-第十三次作业参考答案-第一小题
  3. 关于召开全国大学生智能车竞赛--百度智慧交通项目 技术交流活动通知(北方站)
  4. 2021年春季学期-信号与系统-第五次作业参考答案-第七小题
  5. 无线信标功能初步测试
  6. 航天智慧物流创意组-技术培训
  7. 墨菲定律:都是温度惹的祸
  8. 非抢占式优先算法例题_非抢占式高优先级调度算法
  9. linux 查看san链路状态,linux系统运行状态检查
  10. vue中如何加入横线_在word文档中如何快速添加页眉横线和删除页眉横线?