委托是什麼意思,什麼時候用委托,請舉例說明(通俗易懂的)
請各位指教。

解决方案 »

  1.   

    我的理解,实际上就是函数指针,可以通过这个类型的函数的指针来执行任意的这个类型的函数.经如控件的事件是最好的委托方面的应用,也叫代理,关键字就是delegate了.
      

  2.   

    MSDN:运行库支持称为委托的引用类型,其作用类似于 C++ 中函数指针的用途。与函数指针不同,委托实例独立于它所封装的方法的类;最主要的是那些方法与委托的类型是兼容的。另外,函数指针只能引用静态函数,而委托可以引用静态和实例方法。委托主要用于 .NET Framework 中的事件处理程序和回调函数。所有委托都是从 System.Delegate 继承而来的,并且有一个调用列表,这是在调用委托时所执行的方法的一个链接列表。产生的委托可以用匹配的签名引用任何方法。没有为具有返回类型并在调用列表中包含多个方法的委托定义返回值。可以使用委托的 Combine 和 Remove 方法在其调用列表中添加和移除方法。若要调用委托,可使用 Invoke 方法,或者使用 BeginInvoke 和 EndInvoke 方法异步调用委托。委托类的实现是由运行库提供的,而不是由用户代码提供的。
      

  3.   

    如果你还是不太明白,没关系,可以将类自身理解为一个button(按钮),将调用类理解为Form(窗体),将button的Click(单击)事件对象理解为一个加了event关键字的委托对象,而你在Form中编写的事件(正确的说法应该是事件处理方法)就是关联给委托的函数了.当你单击按钮时,导致Click事件发生,事件对象就会调用与之关联的事件处理方法,也就是Form中的事件.
      

  4.   

    事件和委托  [C#]:事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。委托是一个可以对方法进行引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。下面的示例显示了事件委托声明。[C#]
    // AlarmEventHandler is the delegate for the Alarm event.
    // AlarmEventArgs is the class that holds event data for the alarm event.
    // It derives from the base class for event data, EventArgs.
    public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);[Visual Basic]
    ' AlarmEventHandler is the delegate for the Alarm event.
    ' AlarmEventArgs is the class that holds event data for the alarm event.
    ' It derives from the base class for event data, EventArgs.
    Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)该语法与方法声明的语法相似,但是 delegate 关键字通知编译器 AlarmEventHandler 是一个委托类型。按照约定,.NET Framework 中的事件委托有两个参数:引发事件的源和该事件的数据。注意   一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。.......
      

  5.   

    http://www.cnblogs.com/appleblossom/archive/2004/10/27/57391.html
      

  6.   

    delegate和函数指针差不多
      

  7.   

    有许多人问的,.Net中的委托以及事件处理。我拿简单的例子说明一下,是现实中的例子:比如说一个公司(场景),你是老板,手下有两个员工,小张和小王。
    你命令小王,如果小张玩游戏,则小王扣去小张500元钱。这就是现实中的委托。实际上,在写程序中,程序员就是老板,小张和小王就是两个对象。小张玩游戏是一个方法,小张还有一个游戏事件,他玩游戏激发这个事件。而小王就是事件处理对象,他负责把小张的钱扣除500。所以,委托有如下几个要素:
    1 激发事件的对象--就是小张
    2 处理对象事件的对象--就是小王
    3 定义委托,就是你让小王监视小张。如果这三个要素都满足的话,则你就写出了一个完整事件的处理。下面有个例子:在vs.net2003 C#控制台应用程序编辑运行成功:
    using System;namespace CSharpConsole
    {
        public class 场景
        {
            [STAThread]
            public static void Main(string[] args)
            {
    Console.WriteLine("场景开始了....");
    // 生成小王
    小王 w = new 小王();
    // 生成小账
    小张 z = new 小张(); // 指定监视
    z.PlayGame += new PlayGameHandler(w.扣钱);

    // 开始玩游戏
    z.玩游戏(); Console.WriteLine("场景结束...");
    Console.ReadLine();
             }
        }    // 负责扣钱的人
        public class 小王
        {
    public 小王()
    {
                  Console.WriteLine("生成小王...");
    } public void 扣钱(object sender,EventArgs e)
    {
    Console.WriteLine("小王:好小子,上班时间胆敢玩游戏...");
    Console.WriteLine("小王:看看你小子有多少钱...");
    小张 f = (小张)sender;
    Console.WriteLine("小张的钱: " + f.钱.ToString());
    Console.WriteLine("开始扣钱......");
    System.Threading.Thread.Sleep(500);
    f.钱 = f.钱 - 500;
    Console.WriteLine("扣完了....现在小张还剩下:" + f.钱.ToString());
    }
        }    // 如果玩游戏,则引发事件
        public class 小张
        {
    // 先定义一个事件,这个事件表示“小张”在玩游戏。
             public event PlayGameHandler PlayGame;
    // 保存小张钱的变量
    private int m_Money; public 小张()
    {
    Console.WriteLine("生成小张....");
    m_Money = 1000; // 构造函数,初始化小张的钱。
    } public int 钱 // 此属性可以操作小张的钱。
    {
    get
    {
    return m_Money;
    }
    set
    {
    m_Money = value;
    }
    } public void 玩游戏()
    {
    Console.WriteLine("小张开始玩游戏了.....");
    Console.WriteLine("小张:CS好玩,哈哈哈! 我玩.....");
    System.Threading.Thread.Sleep(500);
    System.EventArgs e = new EventArgs();
    OnPlayGame(e);
    } protected virtual void OnPlayGame(EventArgs e)
    {
    if(PlayGame != null)
    {
    PlayGame(this,e);
    }
    }
        }    // 定义委托处理程序
        public delegate void PlayGameHandler(object sender,System.EventArgs e);}
      

  8.   

    System.Web.UI.Control.SetRenderMethodDelegate这个.NET Framework内部使用的方法就使用了委托。使用委托的原因是Render的时候只能有一个委托生效,具有排它性。即不能让两个委托都附着到这个上面,因为可能导致代码的冲突。静态的需要回调的方法需要使用委托而不是事件。
    考虑这样的方法:public static Load( XXXStream, delegate Finished )就无法修改成事件。
      

  9.   

    chinawn(chinawin) 
    强啊!呵呵。
      

  10.   

    chinawn(chinawin) 的例子很生动呀