艾伟:C#3.0笔记(一)预备知识之Delegate

  在学习C#3.0之前还是先来回顾下委托、事件,因为这样能更加有助于理解C#3.0里面的一些新的特性,如Lambada表达式等。

  背景

  在C语言中我们可以用函数指针来创建回调函数,但是在C里面回调函数存在一些安全问题。因为它只是在内存地址中记录了下来,并没有像方法的参数类型、参数个数、返回值等其他安全信息。而在.Net FrameWork中,回调仍然是可以的,.net framework中提供了更为高级的更为安全的面向对象的delegate来实现。

  定义委托

  在委托中主要包含了三个重要的信息:

  1.调用的方法的名称;

  2.方法的参数;

  3.方法的返回值。

  定义一个简单的委托:

    public delegate int Caculate(int x,int y)

  这样的委托就是签名了参数为两个int类型返回值为int类型的参数,Caculate类型的对象可以在运行时动态地调用其指向的方法。要注意的是.net委托既可以指向动态的方法也可以指向静态的方法。

  C#编译器在处理delegate的时候,它会先自动产生一个继承于System.MulticastDelegate的类。正是这样的类根System.Delegate为委托提供了必要的基础信息,以便来维护需要调用的方法列表。我们可以通过IL查看器看到:

  生成的Caculate类中定义了三个方法:BeginInvoke、EndInvoke、Invoke。其中Invoke是核心的方法,它用来以同步的方式调用委托列表中的每个方法。我们可以看一看编译器是如何定义这几个方法的。Invoke方法中的参数跟返回值完全跟Caculate委托的定义一样的,而BeginInvoke中多了两个参数一个是AsyncCallback类型的一个是object类型的,EndInvoke方法返回Int类型。

  通过MulticastDeletate跟Delegate基类获取更多信息

  我通过上面的IL代码也可以看到编译器生成委托时的类是继承于MulticastDelegate的,而MulticastDelegate继承于Delegate类,所以可以通过这两个类来获取委托更多的辅助信息。在这里只列出一些常用的属性和方法,可以在msdn上获取更多地这两个类的内容(MulticastDelegate成员)。

  1.Methos属性:返回System.Reflection.MethodInfo类型,描述委托所表示的方法信息。

  2.Target属性:返回委托方法所在的对象,如果是静态方法即返回null。

  3.GetInvocationList方法:返回一个Delegate类型的数组,其中数组的每个元素表示一个可以调用的方法。

  4.Combine方法: 静态方法用来给委托添加一个方法。

  5.Remove方法:静态方法给委托移除某个方法。

  看下简单的Caculate的实现,CaculateClient类:



 public class CaculateClient    {public int Add(int x, int y)        {return x + y;        }

public int Subtract(int x, int y)        {return x - y;        }    }

  另外定义了一个辅助方法:

public static void DisplayDelegateInfo(Delegate del){foreach (Delegate d in del.GetInvocationList())    {       Console.WriteLine("Method Name:{0}", d.Method.Name);       Console.WriteLine("Target is:{0}", d.Target);     }}

 

  调用:

static void Main(string[] args){       CaculateClient caClient =new CaculateClient();       Simple.Caculate ca = new Simple.Caculate(caClient.Add);       Console.WriteLine("1+1={0}",ca(1,1));       ca += new Simple.Caculate(caClient.Subtract);       Console.WriteLine("Result:{0}", ca(1, 1));       Simple.DisplayDelegateInfo(ca);       Console.Read();}

  我们可以看到下面的结果:

小结

现在我们基本上知道Delegate的原理,已经基本的实现,但是我们并没有实现一些高级的话题,毕竟Caculate还只是一个玩具,呵呵。下一篇中将会涉及到多播、复杂点的示例以及事件

时间: 2024-09-14 06:03:40

艾伟:C#3.0笔记(一)预备知识之Delegate的相关文章

C#3.0笔记(一)预备知识之Delegate

在学习C#3.0之前还是先来回顾下委托.事件,因为这样能更加有助于理解 C#3.0里面的一些新的特性,如Lambada表达式等. 背景 在C语言 中我们可以用函数指针来创建回调函数,但是在C里面回调函数存在一些安全问 题.因为它只是在内存地址中记录了下来,并没有像方法的参数类型.参数个数 .返回值等其他安全信息.而在.Net FrameWork中,回调仍然是可以的,.net framework中提供了更为高级的更为安全的面向对象的delegate来实现. 定义委托 在委托中主要包含了三个重要的信

C#3.0笔记(二)预备知识之委托与事件

在上篇blog中简单地介绍了委托的基础知识,在这片文章中会介绍下委托跟 事件之间的联系. 事件的由来 我们可以看到在使用委托进行回调 的实现的时候,我们往往需要再定义一个委托对象,以及一个对外公开的辅助方 法来添加委托的方法,这样子会使我们感觉比较繁琐.C#提供了event关键字来 减轻直接使用委托的负担,编译器会自动提供注册.取消注册的方法和委托必要 的成员.首先来看看定义事件的步骤: 1.先定义委托类型: 2.通 过event关键字定委托类型的事件. public delegate int

《51单片机应用开发从入门到精通》——第 1 章 单片机开发预备知识 1.1 单片机开发流程

第 1 章 单片机开发预备知识 单片机的应用十分广泛,从工业控制到家用电器,许多地方都有单片机的身影.掌握了单片机开发技术,不仅能够根据自己的需要进行电子设计,实现自己的一些想法,而且也为进一步学习嵌入式技术打下一定的基础. 本章将对单片机应用系统的软.硬件设计以及开发和调试等各个方面加以介绍,以便读者能通过对本章的学习较快地完成单片机应用系统的研制工作. 1.1 单片机开发流程 单片机的开发主要分为硬件开发和软件开发,在系统设计上又有最小系统和扩展系统两种.下面将通过系统硬件设计.软件设计进行

《C++ Primer Plus(第6版)中文版》——第1章 预备知识

第1章 预备知识 C++ Primer Plus(第6版)中文版 本章内容包括: C语言和C++的发展历史和基本原理. 过程性编程和面向对象编程. C++是如何在C语言的基础上添加面向对象概念的. C++是如何在C语言的基础上添加泛型编程概念的. 编程语言标准. 创建程序的技巧. 欢迎进入C++世界!这是一种令人兴奋的语言,它在C语言的基础上添加了对面向对象编程和泛型编程的支持,在20世纪90年代便是最重要的编程语言之一,并在21世纪仍保持强劲势头.C++继承了C语言高效.简洁.快速和可移植性的

《C语言编程魔法书:基于C11标准》——第一篇 预备知识篇 第1章 C魔法概览1.1 例说编程语言

第一篇 预备知识篇 第1章 C魔法概览 本章内容主要对C编程语言(以下简称C语言)进行大体介绍,包括它的历史以及C语言标准的演化进程.然后介绍一下C语言编程思想,当前主流C语言编译器以及GNU语法扩展.最后简单介绍一下从用C语言编写程序到编译.构建一个可执行程序的大致过程. 计算机编程语言从对计算机硬件底层的抽象程度进行分类,可分为:机器语言.汇编语言以及高级语言.下面由底层到高层分别介绍这几种类别的编程语言. 1.1 例说编程语言 1)机器语言是直接通过十六进制数表示当前处理器架构的机器指令码

《C语言编程魔法书:基于C11标准》——第一篇 预备知识篇 第1章 C魔法概览 1.1 例说编程语言

第一篇 预备知识篇 第1章 C魔法概览 本章内容主要对C编程语言(以下简称C语言)进行大体介绍,包括它的历史以及C语言标准的演化进程.然后介绍一下C语言编程思想,当前主流C语言编译器以及GNU语法扩展.最后简单介绍一下从用C语言编写程序到编译.构建一个可执行程序的大致过程. 计算机编程语言从对计算机硬件底层的抽象程度进行分类,可分为:机器语言.汇编语言以及高级语言.下面由底层到高层分别介绍这几种类别的编程语言. 1.1 例说编程语言 1)机器语言是直接通过十六进制数表示当前处理器架构的机器指令码

《精通 ASP.NET MVC 5》----1.4 本书的预备知识

1.4 本书的预备知识 为了通过本书获得最大收益,你应该熟悉Web开发基础,了解HTML和CSS的工作机制,以及C#的工作知识.如果对客户端细节有点模糊,没有关系.本书的重点是服务器端开发,而且可以通过示例获取所需要的知识.第4章提供了MVC开发最有用的C#语言特性概要,如果你正从低版本向最新版的.NET过渡,便会意识到这些信息是有用的.

《C语言编程魔法书:基于C11标准》——第2章 学习C语言的预备知识 2.1 计算机体系结构简介

第2章 学习C语言的预备知识 我们在第1章已经大致介绍了C语言的概念以及编译.连接流程.我们知道C语言是高级语言中比较偏硬件底层的编程语言,因此对于用C语言的编程人员而言,了解一些关于处理器架构方面的知识是很有必要的,对于嵌入式系统开发的程序员而言更是如此了. 另外,C语言中有很多按位计算以及逻辑计算,所以对于初学者来说,如果对整数编码方式等计算机基础知识不熟悉,那么对这些操作的理解也会变得十分困难.因此,本章将主要给C语言初学者.同时也是计算机编程初学者,提供计算机编程中会涉及的基本知识,这样

《Linux防火墙(第4版)》——第1章 数据包过滤防火墙的预备知识 1.1OSI网络模型

第1部分 数据包过滤以及基本安全措施 第1章 数据包过滤防火墙的预备知识 一个小型站点可能会通过多种方式连接到互联网,如T1专线.电缆调制解调器.DSL.无线.PPP.综合业务数字网(ISDN)或者其他的方式.直接连接到互联网的计算机通常是安全问题的焦点.无论是一台计算机还是由连接起来的多台计算机所组成的局域网(LAN),对于小型站点来说,最初的焦点将是直接连接到互联网的那台计算机.这台计算机将被用来搭建防火墙. 防火墙(firewall)这个术语根据其实现方式和使用目的不同而有多种不同的含义.