关闭

委托和事件

1017人阅读 评论(0) 收藏 举报

我不聪明,学习C#中的“委托”和“事件”,我大概花了整整一天的时间,才算把这两者了解清楚了。
现在,我在这里把我的学习的思路记录下来,方便初学C#的同学,也方便以后我自己万一又犯迷糊了,好利用这篇文档重拾记忆……当然,文章里肯定有不少的错误,也希望各位大虾能够帮俺指正。谢谢啦。

这一次,我准备采用一个比较生动的方式来撰写我的BLOG,我的同学小苏给了我一个可以对屏幕进行录像的工具。这次我就利用它,来重复我的全部的操作过程……
录像的下载地址我会随后贴出来,我先在这里补充一些东西。

补充材料(来自录像):
实现一个Delegate(代理、委托)的步骤:

1、声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
2、创建delegate对象,并将你想要传递的函数作为参数传入。
3、在要实现异步调用的地方,通过上一步创建的对象来调用方法。

实例代码:
 1using System;
 2
 3namespace MyTest
 4{
 5    public delegate void TestDelegate(int x, int y);
 6    class Class1
 7    {
 8        [STAThread]
 9        static void Main(string[] args)
10        {
11            Class1 test = new Class1();
12            TestDelegate td = new TestDelegate(test.add);
13            td += new TestDelegate(test.sub);
14            td(10,5);
15            Console.ReadLine();
16        }

17        public void add(int a, int b)
18        {
19            Console.WriteLine(a+b);//这里结果应该是15
20        }

21        public void sub(int a, int b)
22        {
23            Console.WriteLine(a-b);//这里是5,让我们运行看看。
24        }

25    }

26}

实现一个Event(事件)的步骤:
1、定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。
2、定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。
3、定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型。
4、用event关键字定义事件对象,它同时也是一个delegate对象。
5、用+=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。
6、在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。
7、在适当的地方调用事件触发方法触发事件。

实例代码:

  1using System;
  2
  3namespace ConsoleApplication3
  4{
  5    /// <summary>
  6    /// Class1 的摘要说明。
  7    /// </summary>

  8    
  9    
 10    public delegate void CSProgram(object sender, System.EventArgs e);
 11    
 12    public class Class1
 13    {
 14        /// <summary>
 15        /// 应用程序的主入口点。
 16        /// </summary>

 17        [STAThread]
 18        static void Main(string[] args)
 19        {
 20            Console.WriteLine("系统:CS游戏开始了!");
 21            Console.WriteLine();
 22            //生成游戏玩家小适
 23            HeShi hs = new HeShi();
 24            //生成POD
 25            Pod pod = new Pod();
 26            
 27            //制定监视
 28            pod.PodEvent += new CSProgram(hs.KillPod);//STEP 5
 29
 30            //POD开始玩游戏
 31            pod.MeetHeShi();
 32
 33            Console.WriteLine("系统:CS游戏结束。");
 34            Console.ReadLine();
 35
 36            
 37        }

 38    }

 39    
 40    /// <summary>
 41    /// 游戏玩家小适
 42    /// </summary>

 43    public class HeShi
 44    {
 45        public HeShi()//构造函数
 46        {
 47            Console.WriteLine("系统:生成CS玩家小适。");
 48            Console.WriteLine("系统:玩家小适生成完成。");
 49            Console.WriteLine();
 50        }

 51
 52        public void KillPod(object sender, EventArgs e)
 53        {
 54            Console.WriteLine("小适:重狙!轰!!");
 55            Pod podtemp = (Pod)sender;
 56            podtemp.Life = podtemp.Life - 524;
 57            System.Threading.Thread.Sleep(500);
 58            Console.WriteLine();
 59            Console.WriteLine("系统:POD中弹,现在生命值为:"+podtemp.Life);
 60            Console.WriteLine();
 61        }

 62    }

 63
 64    /// <summary>
 65    /// POD机器人的类
 66    /// </summary>

 67    public class Pod
 68    {
 69        public event CSProgram PodEvent; 
 70
 71        private string name = "Tom";
 72        private int life = 100;
 73        public int Life//属性
 74        {
 75            get
 76            {
 77                return life;
 78            }

 79            set
 80            {
 81                life = value;
 82            }

 83        }

 84
 85        /// <summary>
 86        /// 构造函数
 87        /// </summary>

 88        public Pod()
 89        {
 90            Console.WriteLine("系统:生成新的POD……");
 91            Console.WriteLine("系统:POD生成完成!");
 92            Console.WriteLine();
 93            Console.WriteLine("POD的属性:姓名= "+name+",生命值= "+life+"");
 94            Console.WriteLine();
 95        }

 96
 97        public void MeetHeShi()
 98        {
 99            System.Threading.Thread.Sleep(2500);
100            Console.WriteLine("系统:POD遇见小适……");
101            Console.WriteLine();
102            Console.WriteLine("POD "+name+":我要杀人!" );
103            System.EventArgs e = new EventArgs();
104            this.PodEvent(this, e);
105            
106        }

107    }

108}


OK,下面是重要的部分了:
1、委托Delegate的讲解VCR(37.5MB)已失效
2、事件Event的讲解VCR(42.2MB)已失效
3、所有VCR中实例的源代码(263KB)已失效

posted on 2005-10-04 23:38 小适 阅读(706) 评论(10)  编辑 收藏 收藏至365Key
# re: .NET入门:(5)委托和事件
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:641127次
    • 积分:7249
    • 等级:
    • 排名:第3181名
    • 原创:32篇
    • 转载:265篇
    • 译文:0篇
    • 评论:90条
    最新评论