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. layoutSubviews何时调用的问题(原文:http://www.cnblogs.com/pengyingh/articles/2417211.html)

    今天跟旺才兄学习了一下UIView的setNeedsDisplay和setNeedsLayout方法.首先两个方法都是异步执行的.而setNeedsDisplay会调用自动调用drawRect方法,这 ...

  2. Spring Boot 支持https

    1. 生成key JDK下 keytool -genkeypair -alias mySSL -keyalg RSA -keystore E:\tomcat.key 其中-alias是证书的别名,RS ...

  3. fpga配置方式 .jic固化为ps模式

    FPGA不同下载方式的区别[扫盲]以及如何利用AS模式固化程序(转载)     主动配置方式(AS)和被动配置方式(PS)和最常用的(JTAG)配置方式: AS由FPGA器件引导配置操作过程,它控制着 ...

  4. SQL SERVER BCP导入导出

    bcp是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据.bcp可以将数据库的表或视图直接导出,也能通过SELECT ...

  5. Nginx cpu亲和性调整

    意义 Nginx默认没有开启利用多核cpu,我们可以通过worker_processes指令来启动多个worker,但是worker最终运行在哪些cpu核上是系统层进行调度的:我们可以通过增加work ...

  6. vim小白练习记录

    1.vim卡死  按ctrl+s键后 vim卡死,按任何键不管用,按ctrl+q恢复

  7. python文件读写详解

    # Python3 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, ...

  8. Linux下Centos7对外开放端口

    转载:https://blog.csdn.net/realjh/article/details/82048492 命令集合: ()查看对外开放的端口状态 查询已开放的端口 netstat -anp 查 ...

  9. vuex使用方法

    vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性.比如:我们有几个页面 ...

  10. CSS3——制作带动画效果的小图片

    下了一个软件:ScreenToGif用来截取动态图片,终于可以展示我的小动图啦,嘻嘻,敲开心! main.html <!DOCTYPE html> <html lang=" ...