什么是委托(delegate)

委托(delegate),刚开始学的时候觉得很难理解,我们可以把它看作是一个修饰符,用来修饰一个类的类型,就像public, static等一样。定义一个delegate类和我们平时定义类差不多。我们来看一下我们经常用到的EventHandler类的定义,它是.NET中的一个类:

Code
public delegate void EventHandler(object sender, EventArgs e);

上面的代码可以看成是定义一个delegate的类,类的名字是EventHandler。下面是我定义一个普通的类,看看它们之间有什么区别:

Code
public class UserInfo{}

可以看到,delegate的类和普通的类的定义还是有比较大的不同的,这只要记住它的格式就行了。我们再看看创建类的实例:

Code
UserInfo userInfo = new UserInfo();
EventHandler handler = new EventHandler(MethodName);

从代码中可以,它和创建普通的类的实例没什么不同,只是它必须要有参数,而且只能有一个。这个参数很特别,它不是什么类型的参数,而是方法的名字。方法有很多的类型(这里不是指public,static等等这种类型),就像参数也有很多种类型一样,它总不能是无论什么样的方法都接受吧。那是当然的了,它到底能接受什么样的方法呢。这就需要用到修饰了。

上前面,我们看到了定义delegate的类有很大的不同。在它的后面多了一个void,它的前面也多了两个参数,这些是干什么用的呢?可能你已经想到了,就是用来修饰方法的类型的。它限定了方法的返回值必须是void,它的参数是(object sender, EventArgs e),只要符合这两个要求的方法都可以传给它。

上面的代码还可以简单地写成:EventHandler handler= MethodName;。这样赋值的话,它的实例像不像是一个方法指针了呢?赋值后我们就能像调用方法一样调用它了,如:handler(sender, e); ,调用handler,就相当于是调用了方法MethodName。通过handler调用MethodName的过程就叫做代理,也可以叫做委托,也就是MethodName把使用权委托给handler。

时间: 2024-08-31 22:11:27

什么是委托(delegate)的相关文章

委托(delegate)在自定义控件的应用

在自定义用户控件中,我们经常要添加自定义的事件,这时就要使用到委托(delegate)了. 在做开发中,经常都要用到登录.那么,我们就把登录的界面做成一个控件,以后再使用它就方便多了. 登录界面很简单,随便做做的,它有一个"登录"的按钮.我们需要当点击"登录"按钮时,它能执行我们在其它页面定义的登录操作,这时就需要用到委托了,把登录操作委托给"登录"按钮来执行.下面是用户控件的后台代码: Code public partial class Web

什么是.Net的异步机制(委托Delegate)

在阅读下面知识前,我已经认为你已经具有c#的基础,包括简单的委托知识; 代码使用VS2008开发,但是会在.Net Framework 2.0(C Sharp)编写 什么是.Net异步机制呢? 在解释这个话题前,我们先看看同步的程序,就是我们常用的Hello World 程序. Code 1: 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 // 查看当前的线程ID, 是否线程池里面的线程 6 Console.WriteLi

javascript委托(Delegate)blur和focus用法实例分析

本文实例讲述了javascript委托(Delegate)blur和focus用法.分享给大家供大家参考.具体分析如下: Opera (9.5b) 对于所有的focus和blur事件,不能正确的触发两次: 因此,focus和blur事件的处理函数可以被委派到事件的捕获阶段. 例子1(列表类): 代码如下: <ol id="列表"> <li><a href="#">列表项1</a> <ol> <li&g

physx-根据委托(delegate)和事件的知识,请用事件模拟实现以下业务逻辑

问题描述 根据委托(delegate)和事件的知识,请用事件模拟实现以下业务逻辑 业务描述:比如说一个家庭有朋友来访,主人开始做饭,做饭成功后喊大家吃饭,做饭失败带大家出去吃 要点:主人类需要公开[做饭成功事件].[做饭失败事件],然后分别绑定不同的事件处理方法(喊大家吃饭.带大家出去吃).无需实现[喊大家吃饭].[带大家出去吃]方法,直接在事件处理方法中使用伪代码调用即可. 请使用C#代码(必须采用事件机制).

解析.Net 4.0 中委托delegate的使用详解_实用技巧

.Net中的委托从功能上讲和c语言或者c++中的方法指针类似,可以像调用方法一样调用委托完成某个功能,或返回某类结果.但是.Net毕竟是更高级的语言,委托Delegate也更高级了,委托是一种数据接口,它包含调用目标和调用方法的指针:而在.Net中定义的委托都继承自MulticastDelegate即多播委托,所谓的多播委托是指可以包含多个调用方法的委托.一. 先来看下委托的定义:如下C#代码定义委托public delegate void DoSomething(int times);委托的定

C# 委托(delegate) 的小例子_C#教程

代码如下: 复制代码 代码如下: static void Main(string[] args)        {           Console.WriteLine(Exec(GetSet));           Console.ReadKey();        }        //定义委托,用于将方法做为参数传给Exec.        public delegate string GetResultDelegate();        public static string G

.Net的异步机制(委托Delegate) - STEP 1

在阅读下面知识前,我已经认为你已经具有c#的基础,包括简单的委托知识; 代码使用VS2008开发,但是会在.Net Framework 2.0(C Sharp)编写 什么是.Net异步机制呢? 在解释这个话题前,我们先看看同步的程序,就是我们常用的Hello World 程序. Code 1: 1    class Program  2    {  3        static void Main(string[] args)  4        {  5            // 查看当前

ASP.NET入门随想之多态、接口与委托

asp.net     曾几何时,我们居住的陆地沉睡在海底,大陆也紧密的联系在一起,千百年过去了七大洲的地壳板块在缓缓移动,喜马拉雅山在慢慢增高,世界在变,唯一不变的是变化. ■ 软件开发的悖论 - 把变化变成计划 在软件开发活动的过程中,常被一个悖论所缠绕:不写码就搞不清该做什么:搞不清做什么又不知道该如何写码. 人的思维是很随意的东西,不同的人,或同一个人的不同阶段,对同一件事情的看法都会有差异,可谓是远看成岭侧成峰,远近高低各不同.随意再加上变化,常常引起项目流产或工期大大拖延. 之所以会

C#高级(八)委托

一.委托 当我们需要把方法做为参数传递给其他方法的时候,就需要使用委托. 因为有时候,我们要操作的对象,不是针对数据进行的,而是针对某个方法进行的操作. 我们还是来以代码入手 using System; namespace gosoa.com.cn { public class test { public delegate string GetAString(); public static void Main() { int x=10; GetAString firstString=new G