C#中委托如何使用?(转帖)

1.委托概述
委托是C#中新加入的一个类型,可以把它想作一个和Class类似的一种类型,和使用类相似,使用一个委托时,需要两个步骤,首先你要定义一个委托,就像是定义一个类一样;然后,你可以创建一个或多个该委托的实例。
定义一个委托的语法是这样的:
[public/protected/private] delegate returnType delegateName(paramtype param1,…)
这是我自己写的,看起来好像有点怪怪的,我来解释一下,private/protected/private是限定词,就不多说了,delegate是申明一个委托的关键词,returnType是一个返回类型,delegateName是一个你给委托起的名字,你可以写任何一个你喜欢的名字,paramtype param1…这个是参数列表。说了这么多可能看起来还是不是很好理解,我是这样认为的,实用点来讲,委托定义就是在一个函数定义中间加入一个delegate的关键词。它的作用类似于你申明一个类:
public class ClassName {…}
创建一个委托的实例:
[public/protected/private] delegateName deleInstanceName = new delegateName(MethodName)
这个类似于实例化一个类,public ClassName instancename = new ClassName(…),这里有个要注意的地方,即MethodName方法要和delegateName的签名一致。什么是签名一致,就是说MethodName的参数列表,返回值要分别和returnType、(paramtype param1,…)一致。举个例子来说明下:
public delegate string DelegateDemo(string name, int age);
比如我们如上定义了一个委托,就写法来说,其实就是在函数 string DelegateDemo(string name, int age)前面加了一个delegate的关键字,下面我们来用创建一个函数:
public string AgentDemo(string name, int age)
{
string rev = “”;

     return rev;
}
这个函数是做参数传递给一个DelegateDemo实例的,接下来创建一个DelegateDemo的实例:
DelegateName instanceDemo = new DelegateName(AgentDemo);
这时要说到一致了,即AgentDemo和声明委托时的DelegateDemo(我们姑且将delegate去掉)这两个函数的返回值,参数列表要相同。终于说完了,不知道看的人明不明白。
接下来,我们可以使用这个委托了(调用一个委托),如下:
string name = “cshape”;
int age = 20;
instanceDemo(name, age);
当instanceDemo执行时,会执行AgentDemo函数,instanceDemo相当于C里的一个函数指针,现在这个指针指向AgentDemo的函数入口地址。
2.多点委托
前面提到的委托都只包含对一个方法的调用,如果需要调用多个方法,需要多次显示的调用这个委托,我们还有另的选择,我们可以让一个委托中包含多个方法,这样我们一次显示调用委托,就可以按照顺序连续的调用多个方法。看下面的例子:
public delegate void MultiDelegate(string name);
public void AgentDemo1(string str)
{
     Console.WriteLine(str + “this is AgentDemo1\n”);
}

public void AgentDemo2(string s)
{
     Console.WriteLine(s + “this is AgentDemo2\n”);
}

MultiDelegate multiDemo = new MultiDelegate(AgentDemo1);
multiDemo += new MultiDelegate(AgentDemo2);
multiDemo(“multiDemo test :”);

输出的结果应该是:
multiDemo test :this is AgentDemo1
mutliDemo test :this is AgentDemo2

可以看到我们一次显示的调用一个委托,它顺序的(按照你添加方法的顺序)执行了方法AgentDemo1和AgentDemo2。这里要注意的有几点:
●     委托支持 +=,-=这样的运算符,对应为添加或去掉一个方法
●     多点委托不可以定义有返回值,因为无法处理多个方法的返回值,所以如果要使用多点委托,应该用void,否则你的编译会返回一个错误
●     多点委托不建议你的参数列表中有OUT的类型,这样只会out最后一个方法的值,其他的值会丢失。
3.委托的理解
首先申明,这只是我举的一个例子,目的是帮助理解委托的过程,其中很多地方都经不起推敲,望大家知悉。言归正传,
你想要吃饭,
但是自己又不会做(委托方不知道实现细节),
你计划找个饭店,叫个回锅肉饭(定义了一个委托)
你决定找常去的那家叫做A的饭店(实例化一个委托)
你打电话给A饭店(委托调用)
A饭店给你做好了你的回锅肉饭(代理函数工作)
饭来了,真好。

4.委托的使用时机
当你需要把一个方法传送给其他方法时,可以考虑使用委托。好像不是很好理解,也可以这样说,当你确定要处理一件事,但又不能确定处理方法时,可以考虑用委托。其实单独的说委托的应用好像有点牵强,委托更多的是在事件中的应用。
5.一个委托的例子
我用两个类来做这个例子,一个类,我称它为委托方,一个类我称它为代理方,代码如下:
using System;

namespace Visen.Demo.Delegate
{
     ///<summary>
     /// StartUp 委托演示中的程序入口,含委托方。
     ///</summary>
     class StartUp
     {
     #region公用的方法

#region应用程序的主入口点。
         ///<summary>
         ///应用程序的主入口点。
         ///</summary>
         [STAThread]
         static void Main(string[] args)
         {
              Console.WriteLine("This is a delegate demo\n");

Visen.Demo.Delegate.Agent ag = new Agent();

//定义一个委托类型的对象
              OutMessage singleDele = new OutMessage(ag.ShowMessage);
              OutMessage deleStaticMeth = new OutMessage(Agent.SShowMessage);

//定义一个多点委托
              OutMessage MultiDele = new OutMessage(ag.ShowMessage);
              MultiDele += new OutMessage(Agent.SShowMessage);
           
              singleDele(" delegate instance singleDele");
              deleStaticMeth(" delegate instance deleStaticMeth");
              MultiDele(" this is a MultiDele");
              Console.Read();
         }
         #endregion应用程序的主入口点。

#endregion公用的方法

#region私用的字段
         ///<summary>
         ///定义一个委托类型
         ///</summary>
         private delegate void OutMessage(string msg);
     #endregion私有的字段
     }
}

下面是代理方:
using System;

namespace Visen.Demo.Delegate
{
     ///<summary>
     /// Agent 类为委托者的代理方,处理委托者委托的事务。
     ///</summary>
     public class Agent
     {
     #region公用的方法

#region空的构造函数
         ///<summary>
         ///空的构造函数
         ///</summary>
         public Agent()
         {
         }
         #endregion空的构造函数

#region显示一条信息到控制台,一个类成员函数作为代理方
         ///<summary>
         ///显示一条信息到控制台,一个类成员函数作为代理方
         ///</summary>
         ///<param name="msg">显示内容</param>
         public void ShowMessage(string msg)
         {
              Console.WriteLine("Method ShowMessage out:" + msg + "\n");
         }
         #endregion显示一条信息到控制台,一个类成员函数作为代理方

#region显示一条信息到控制台,一个类静态函数作为代理方
         ///<summary>
         ///显示一条信息到控制台,一个类静态函数作为代理方
         ///</summary>
         ///<param name="msg">显示信息</param>
         public static void SShowMessage(string msg)
         {
              Console.WriteLine("static Method SShowMessage out:" + msg + "\n");
         }
         #endregion显示一条信息到控制台,一个类静态函数作为代理方

#endregion公用的方法
     }
}
输出为:
This is a delegate demo

Method ShowMessage out: delegate instance singleDele

static Method SShowMessage out: delegate instance deleStaticMeth

Method ShowMessage out: this is a MultiDele

static Method SShowMessage out: this is a MultiDele

可见:方法函数可以是类成员函数,也可以是一个静态成员,只要和委托的签名相同就可以了。

http://zhidao.baidu.com/link?url=6r_4M47uClupVFDJgs-g9dOgZTrGh1yrYRGoqkMDymN_kGcYEANiQpkVLQ42qVihAH-oAq7xZjSr-9vlUQaPVK

时间: 2024-10-21 14:45:49

C#中委托如何使用?(转帖)的相关文章

C#中委托和事件

目 录 1.1 理解委托 2 1.1.1 将方法作为方法的参数 2 1.1.2 将方法绑定到委托 4 1.2 事件的由来 6 1.2.1 更好的封装性 6 1.2.2 限制类型能力 9 1.3 委托的编译代码 10 1.4 .NET 框架中的委托和事件 11 1.4.1 范例说明 11 1.4.2 Observer 设计模式简介 12 1.4.3 实现范例的Observer 设计模式 13 1.4.4 .NET 框架中的委托与事件 14 1.5 委托进阶 16 1.5.1 为什么委托定义的返回值

详解Objective-C中委托和协议

Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托. AD:[活动]Web和APP兼容性实战 Win10训练营免费报名 Objective-C中委托和协议是本文要介绍的内容,委托和协议是两个概念,协议实际上相当于C++中的纯虚类的概念,只定义并只能由其它类来实现.而委托类似于Java中的接口.(Objective-C实现委托这种机制是利用协议来实现的,这种说

C#中委托和事件的区别实例解析

这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用.具体如下: 大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. 一.通过委托执行方法 1 2 3 4 5 6 7 8 9 10 11 12 13 1

c#中委托和事件(转)

C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 将方法作为方法的参

C#中委托的进一步理解

文章介绍了委托的基本知识,接下来就进一步研究一下委托. 委托类型 其实,刚开始觉得委托类型是一个比较难理解的概念,怎么也不觉得下面的"AssembleIphoneHandler"是一个类型. 代码如下: public delegate void AssembleIphoneHandler(); 按照正常的情况,如果我们要创建一个委托类型应该是: 代码如下: public class AssembleIphoneHandler : System.MulticastDelegate { }

c#中委托与事件的关系

C#中的事件处理实际上是一种具有特殊签名的delegate,象下面这个样子:public delegate void MyEventHandler(object sender, MyEventArgs e);其中的两个参数,sender代表事件发送者,e是事件参数类.MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从System.EventArgs类派生.当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数. 就是这么简单,结合delega

C#中委托和事件的区别

大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. □ 通过委托执行方法 class Program { static void Main(string[] args) { Example example = new Example(); example.Go(); Console.ReadKey(); } } public class Example { pu

C#中委托演变的的三个阶段

命名函数 匿名方法 lambda表达式 委托是一种可以把引用存储为函数的类型,定义了委托后,就可以声明该委托类型的变量,接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用,之后就可以使用委托变量调用这个函数,就像是该变量是一个函数一样,有了引用函数的变量后,还可以执行不能用其他方式完成的操作,例如可以把委托变量作为参数传递给一个函数,这样该函数就可以使用委托调用它引用的任何函数,而且在运行之前无需知道调用的是哪个函数. using System; using System.Colle

C#中 委托和事件的关系

首先,委托 是一个好东西.按我的理解,委托 是针对 方法 的更小粒度的抽象.比较interface,他精简了一些代码.使得 订阅-通知 (观察者模式)的实现变得非常简洁. 关于事件,我最初的理解是:事件是利用委托  对  通知-订阅模式 的一种实现方式. 我觉得我并没有理解错,但还不够精确. 我现在要问: 为什么要用非要事件来实现 通知-订阅模式? 而不直接用委托呢?事件到底解决了什么问题? 在<果壳中的C# 中文版> P112页 说了. 总的目标是 事件-订阅 模式中,保护订阅互不影响. 如