zoukankan      html  css  js  c++  java
  • C#事件的理解以及自定义事件的方法

    C#事件的理解以及自定义事件的方法

    事件的理解:

      在skyline项目的开发中,遇到了一个新的知识:事件。

      在程序中,我希望实现一个功能,当视点坐标移动的时候可以实时的得到视点的坐标。

    这里就需要使用事件这个概念:当坐标发生移动,则触发了一个特定的事件,

    他可以发出一个信号,

    而用户可以自定义一个函数(参数必须与事件委托的参数相同,这个后面解释),

    当他发出一个信号,我就可以执行这个函数。

      比方说:甲和乙是朋友,上午见面了,乙和甲说,今天中午吃完饭叫我一声,我带你去网吧玩。

      在这个情景中,甲吃饭这件事情是乙没有办法控制的。他只可以等甲吃完饭以后发一个信号,才可以做带甲去网版的这个方法。

    当然乙可以蹲在甲的家门口一直看着甲,等甲吃完饭然后就可以带他去网吧,

    但是这样的话,是不是很浪费乙的时间呢。

      同样的,skyline的项目中,我们也可以做一个无限的循环,随时记录这视点坐标的参数,

    然后在循环的下一次得到视点坐标参数再和刚刚那一次做比较,

    如果不同的话就执行希望运行的那个函数。

    而这样的话对于程序来说会形成一个死循环,是没有意义的。

      下面写一个小程序来具体化一下这个甲和乙的小故事:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Sample001
    {
        public delegate void InformHandle(object sender);
        public class JIA
        {
            public event InformHandle EatOver;
            public void eat()
            {
                Console.WriteLine("吃饭中......");
                System.Threading.Thread.Sleep(2000); //吃饭事件两秒
                OnEating();  //这个相当于是一个信号,当运行这个函数的时候会发出一个信号。
            }
            public virtual void OnEating() {
                if (EatOver != null)
                {
                    EatOver(this);
                }
            }
        }
    
        public class YI
        {
            public void TakeJiaToWangBa(object sender)
            {
                Console.WriteLine("带"+sender.ToString()+"去网吧!");
            }
        }
    
        class Program {
            static void Main(string[] args)
            {
                JIA jia1 = new JIA();
                YI yi1 = new YI();
                jia1.EatOver += new InformHandle(yi1.TakeJiaToWangBa);
                Console.WriteLine("空闲中");
                Console.WriteLine("现在甲不知道在干什么");
                jia1.eat();
                Console.WriteLine("去了网吧通宵一个晚上到了第二天中午");
                jia1.eat();
                Console.ReadKey();
            }
        }
    }

    运行结果如图:

    这个代码的意义在于说明,乙的TakeJiaToWangBa的方法只会在甲吃完饭这个事件发生的时候才会执行。当我们在Main方法中写入了

    jia1.EatOver += new InformHandle(yi1.TakeJiaToWangBa);

    这行语句,就表名了:当甲触发了EatOver事件的时候,就会发出一个信号,然后乙就开始执行TakeJiaToWangBa这个函数了。在后面的代码中我们就不必去关心什么时候执行TakeJiaToWangBa方法了。

    还有一个问题就是甲是如何触发EatOver这个事件的呢,就是靠下面的这个代码来完成,甲在运行eat方法的时候,会执行OnEating方法。我对下面这段代码的原理也不是很理解。

            public virtual void OnEating()
            {
                if (EatOver != null)
                {
                    EatOver(this);
                }
            }
    

    从功能上来说,当执行OnEatring方法时,就已经触发了EatOver事件。EatOver(this)的信号就已经发出去了。而且这个信号中还包含着一个参数(这个实例本身)。如果别人希望当触发这个事件之后运行自己希望运行的代码的话,就需要定义一个方法,这个方法也必须有一个与这个事件相同类型的参数(在这段代码中,他们的类型都是object),用户定义的这个方法在运行的时候就可以访问这个参数了。

    这个参数的类型又是又什么决定的呢?是由委托来决定的!

        public delegate void InformHandle(object sender);

    感觉说的不是很清楚,大概意思就是这样了,等我彻底搞清之后再对本文进行一下修改。如果大家对本文有什么疑问,或者想指点一下我的话可以发评论,我每天都会看的。谢谢啦!

  • 相关阅读:
    将程序集从GAC中导出
    客户端访问WebService复杂参数类型的使用和参数的序列化与反序列化
    (译Workflow in the 2007 Microsoft Office System)介绍(部分)
    处理PageRequestManager事件
    测试 IPersonalizable接口
    几篇很好的文章
    交换两个数,不引入第三个变量
    Dijkstra算法
    给定一个整数,求它的二进制表示中有多少个1。
    自律
  • 原文地址:https://www.cnblogs.com/grj001/p/12225163.html
Copyright © 2011-2022 走看看