什么是委托?

比如说一个公司(场景),你是老板,手下有两个员工,小张和小王。你命令小王注意小张,在开发软件工作的时候如果上网打游戏,你就记录下来,从小张工资里扣100元钱。这个实际上就是现实中的委托。  
   
  这个实际上就是委托,编写程序的就是老板,运行时就是场景,小张和小王就是两个对象,小张上网打游戏就是对象的一个方法,你指定小王注意上网打游戏就是你定义一个事件,你指定小王扣100元钱就是小王对象的一个方法,这个方法在事件发生的时候自动被调用。  
   
  所以委托必须有三个要素:  
  1   激发事件的对象,就是小张。  
  2   定义事件,就是你要让小王监视。  
  3   事件发生后执行的方法,就是让小王扣小张100元钱。  
   
  在程序中定义好上面三个要素后,实际上你就定义了一个委托

 

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);
}

/*实际上,委托很容易理解。委托就是在条件成立的时候触发一个事件,从而可以调用一段代码。这个概念可以转换到现实中来。   
    
  */

 

C# 中的委托类似于 C 或 C++ 中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与 C 或 C++ 中的函数指针不同,委托是面向对象、类型安全的,并且是安全的。

posted @ 2008-08-27 18:00  kin2321  阅读(410)  评论(0编辑  收藏  举报