C#之委托(一)
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#之委托(一)的更多相关文章
- 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 方法,向 ...
- C#委托异步调用
参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/w ...
- JavaScript事件代理和委托(Delegation)
JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...
- .NET面试题系列[7] - 委托与事件
委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
随机推荐
- iOS app被拒整理
作者:Leon链接:http://www.zhihu.com/question/33191327/answer/71421736来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- UVa11538 A Chess Queen
A Chess Queen Problem A Chess Queen Input: Standard Input Output: Standard Output You probably know ...
- IntelliTrace调试
当您进行调试时,IntelliTrace 将在后台收集有关托管应用程序的数据,其中包括来自许多框架组件(例如 ADO.NET.ASP.NET 和 System.XML)的信息.这些 IntelliTr ...
- 什么是LMDB闪电记忆映射数据库
LightningMemory-MappedDatabase(LMDB)是一个软件库,它以键值存储的形式提供高性能的嵌入式事务数据库.LMDB是用C语言编写的,具有多种编程语言的API绑定.LMDB将 ...
- 【01】Python 环境变量、条件判断、循环、基本运算符
1 环境变量 1.1 Windows下环境变量 系统变量Path中要加入Python安装路径: C:\xxxx\Python36;C:\xxxx\Python36\Scripts; 2 条件判断 2. ...
- 使用VisualStudio 开发Arduino
Arduino IDE界面简洁,整体功能还算完善,相比其他编译器明显的不足就是不能进行硬件调试,再就是没有代码提示功能,文件关系不清晰.头文件打开不方便. VisualStudio作为时下最为流行的W ...
- 运行biggan demo
http://www.zhuanzhi.ai/document/8705953a704e1bf8e051c161d1587d88
- Stree
题目 给出n个点,m条有权边,现对于每一条边,你需要回答出包含这条边的最小生成树的总边权值. 分析 首先我们可以构造一个对于这n个点,m条有权边的最小生成树,显然,这是一棵最小的生成树. 那么这棵生成 ...
- 容器镜像服务 联手 IDE 插件,实现一键部署、持续集成与交付
容器技术提供了一种标准化的交付方式,将应用的代码以及代码环境依赖都打包在一起,成为一个与环境无关的交付物,可以被用在软件生命周期的任何阶段,彻底改变了传统的软件交付方式. 甚至可以说,是在容器技术之后 ...
- 洛谷P1309 瑞士轮——题解
题目传送 思路非常简单,只要开始时把结构体排个序,每次给赢的加分再排序,共r次,最后再输出分数第q大的就行了. (天真的我估错时间复杂度用每次用sort暴力排序结果60分...)实际上这道题估算时间复 ...