1,什么是委托

简单来说,就是代码在恰当的时间执行一段操作。代码不需要操作的细节。举个例子,遗嘱为例。一般来说遗嘱是在某人去世之前写好,然后把它放发到一个安全的地方,去世之后然后律师会执行遗嘱中的指令。

2,简单委托的构成

一个完整的能执行的委托必须满足4个条件:

1,声明委托类型。

2,必须创建一个委托的实例。

3,必须有一个方法包含了要执行的代码。

4,必须调用invoke执行委托。

2.1 声明委托

声明委托类型其实相当于创建一个类。其实也只是规定了实例操作需要的参数列表和返回值。

代码中声明了一个委托,delegate代表声明的是个委托类型,返回值是void(空),参数是一个String。其实重要的是在类型查看器里面新建的委托是继承MulticastDelegate的。而后者继承Delegate。所以将基类的一些方法传递给实例。

2.2,创建一个委托实例

可以想创建类一样创建委托,只是在初始化的时候需要传入一个方法。

            stringProcessor proc1, proc2;
proc1 = new stringProcessor(StaticMethodes.Printstring);
proc2 = new stringProcessor(Instance.Printstring);

如果是静态方法,直接调用方法即可。如果是实例方法,必须创建类型。

2.3,创建要执行的方法

方法的要求只要和定义委托中拥有相同的签名。就是有相同的返回值和参数类型。下面列出两个方法签名。

        void Prinstring(string x);
void PrintObject(Object X);

第一个方法签名完全符合没什么问题,有趣的是第二个因为String是从Object中派生的。其实在C#1中是要求委托参数必须一致。但在c#2中有了改善。这个我们后面在说。然后只要把方法传到第二步创建的委托实例中就可以完成委托的声明了。

2.4,调用委托

最后一步就是调用委托了,只要调用委托实例的一个方法(Invoke)就可以了。

proc1.Invoke("Hello");

现在尝试写一个完整的例子,然后和输出结果看一下有什么特点。

delegate void stringProcessor(string input);

    class Person
{
string name;
public Person(string name)
{
this.name = name;
}
//声明实例方法
public void Say(string message)
{
Console.WriteLine("{0} say: {1}", name, message);
}
} class Background
{
public static void Note(string note)
{
Console.WriteLine("note:{0}", note);
}
}
class Program
{ //自定义事件
static void Main(string[] args)
{
Person jon = new Person("Jon");
Person tom = new Person("Tom"); stringProcessor jonvoice = new stringProcessor(jon.Say);
stringProcessor tomvoice = new stringProcessor(tom.Say);
stringProcessor background = new stringProcessor(Background.Note); jonvoice("Jon");
tomvoice.Invoke("Tom");
background("ddddd"); Console.ReadKey();
}
}

上面例子分别调用了实例方法和静态方法。在最后调用的时候,可以使用invoke的显示调用,也可以使用C#的简化形式。其实委托的意义就在于增加了代码的灵活性,将方法抽象出来。想象一下,如果你想在点击按钮之后反生某事,而且不想对按钮本身的代码进行修改。只希望可以在按钮的事件掉用完之后调用下自己的代码。委托就是完成了这种操作。现在我们看看如果多个委托合并到一块。也就是我们常说的多播委托。

3,合并和删除委托

在第二部分的时候说过所有的委托都是基础System.Delegate的,Delegate中有两个静态的方法Combine和Remove,用来对委托的实例进行删除和添加实例。在这里说名一下,委托的不易变的。这里的Combin和Remove调用之后会产生一个全新的委托实例。是通过+=或者-=来实现Combine和Remove的方法调用的。

委托的介绍就先到这里,以后还会说一下事件和委托的差别,lambda的运用,也会会提到其他一些关于委托的知识点。

C#之委托(一)的更多相关文章

  1. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  2. C#基础篇 - 理解委托和事件

    1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...

  3. [.NET] C# 知识回顾 - 委托 delegate (续)

    C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...

  4. [C#] C# 知识回顾 - 委托 delegate

    C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...

  5. 9、委托、事件、Lambda

    开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.)   第 ...

  6. iOS 委托与文本输入(内容根据iOS编程编写)

    文本框(UITextField) 本章节继续编辑 JXHypnoNerd .文件地址 . 首先我们继续编辑  JXHypnosisViewController.m 修改  loadView 方法,向  ...

  7. C#委托异步调用

    参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/w ...

  8. JavaScript事件代理和委托(Delegation)

    JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...

  9. .NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  10. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. vue图片不存在时加载默认图片

    在文件中的img那里添加:οnerrοr="errorImg01",然后设置errorImg01的路径如果直接写成 errorImg01: ('../../assets/image ...

  2. 用eclipse怎么打war包?

    用eclipse怎么打war包? 在服务器上部署很多都是用war包进行部署的,eclipse是很友好的支持把java项目打成war包的,下面就把打war的经验写出来,供大家参考 百度经验:jingya ...

  3. fpga ip

    原文地址:altera FIR ip核 license破解作者:王永刚Aether 在证书文件中添加一段: FEATURE 6AF7_0012 alterad 2035.12 permanent un ...

  4. 009-流程控制 for 语句

    流程控制 for 语句 ##################### 语法一 ################################# #!/bin/bash do echo $i done ...

  5. aidl 详解

    aidl 是 android interface define language 的缩写,主要是作为进程间通讯的一个接口规范,这种通讯是一种普通的 client-server 的模式,对于 clien ...

  6. thymeleaf常用模板方法收集

    判断是不是为空1.th:if="${xxx} != null" th:if="${xxx != null}" 是不是为空字符串 1.th:if="${ ...

  7. snmpwalk工具使用

     snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户. 在linux下使用snmpwalk工具,我们 ...

  8. 使用Vscode添加中文汉化插件

    一.首先打开Vscode,找到该软件的扩展,如下: 二.点击扩展按钮之后,会出现如下的界面,有一个扩展搜索输入框,输入chinese之后,会随之产生一些匹配的插件 三.重启一下Vscode,然后就看到 ...

  9. bzoj1195 [HNOI2006]最短母串 AC 自动机+状压+bfs

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1195 题解 建立 AC 自动机,然后构建出 trie 图. 然后直接在 trie 图上走.但是 ...

  10. 基于VUE多人聊天项目

    项目背景 公司平台要做一个通讯系统,本来是java 来做的后面改前端+PHP来做,所以就用VUE来做这个了. github github地址 新人求star 技术栈 vue-axios vuex we ...