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与数据库开 ...
随机推荐
- Python 计算Numpy向量之间的欧氏距离
vector1 = np.array([1,2,3]) vector2 = np.array([4,5,6]) dist = numpy.sqrt(numpy.sum(numpy.square(vec ...
- MIT-线性代数公开课
本博客是学习MIT-线性代数笔记,Gilbert Strang大神讲的通俗易懂,感兴趣的可以观看视频 其中习题集请点击 01)方程组的几何解释 02)矩阵消元 03)乘法和逆矩阵 04)A的LU分解 ...
- fpga错误总结
Error (10200): Verilog HDL Conditional Statement error at ps2_con_cmd.v(11): cannot match operand(s) ...
- centos 7 安装相关环境
How To Create a Sudo User on CentOS 7 https://www.digitalocean.com/community/tutorials/how-to-create ...
- 第二节,下载openwrt源码和编译环境
文章的开始先说两个重点 1.不要使用root用户编译,普通用户编译即可. 2.自行搭建梯子,以免编译失败. 一,进入虚拟机内的Ubuntu系统 点击左下角的显示应用程序,我们去修改一下Ubuntu的源 ...
- qt01 lineEdit pushButton
1. void udp_server::on_lineEdit_textEdited() { ui->pushButton->setEnabled(ui->lineEdit-> ...
- VMware虚拟机磁盘文件vmdk单文件转多文件相互转换
设置环境变量 set PATH=%PATH%;D:\Program Files (x86)\VMware\VMware Workstation echo %PATH% C:\Users\Admi ...
- ztree 获取CheckBox选中节点时,不获取选中上级父节点
//将第三个参数改为false,表示不去勾选父节点下的所有子节点 zTreeObj.checkNode(node, true, false); setting.check.chkboxType = { ...
- 自定义过滤器-vue
1.自定义过滤器名与内置过滤器冲突,则内置的会被覆盖:后注册的过滤器与前注册的冲突,则之前的会被覆盖 2.自定义过滤器 1)单参数 2)多参数 3
- [每日一讲] Python系列:Python概述
Python 序章 概述 Python 是弱类型动态解释型的面向对象高级语言,其具备面向对象的三大特点:封装.继承.多态.Python 代码运行时,其有一个编译过程,通过编译器生成 .pyc 字节码 ...