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

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

  • 相关阅读:
    iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
    iOS NSArray数组过滤
    App Store2016年最新审核规则
    iOS 根据字符串数目,自定义Label等控件的高度
    iOS 证书Bug The identity used to sign the executable is no longer valid 解决方案
    Entity FrameWork 增删查改的本质
    EF容器---代理类对象
    Entity FrameWork 延迟加载本质(二)
    Entity FrameWork 延迟加载的本质(一)
    Entity FrameWork 增删查改
  • 原文地址:https://www.cnblogs.com/grj001/p/12225164.html
Copyright © 2011-2022 走看看