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

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

C#事件的理解以及自定义事件的方法,布布扣,bubuko.com

时间: 2024-10-10 15:35:04

C#事件的理解以及自定义事件的方法的相关文章

Spring 事件(2)- 自定义事件

Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – IOC) 理解依赖注入(DI – Dependency Injection) Bean XML 配置(1)- 通过XML配置加载Bean Bean XML 配置(2)- Bean作用域与生命周期回调方法配置 Bean XML 配置(3)- 依赖注入配置 Bean XML 配置(

javascript事件之:谈谈自定义事件(转)

http://www.cnblogs.com/pfzeng/p/4162951.html 对于JavaScript自定义事件,印象最深刻的是用jQuery在做图片懒加载的时候.给需要懒加载的图片定义一个appear事件.当页面图片开始出现时候,触发这个自定义的appear事件(注意,这里只触发一次). 由此,现在我们通过JavaScript谈一谈自定义事件. 所谓事件,说的明白点,就是在一个合适的时候触发调用某个函数.平常说的事件是那些比较常用的,绑定在元素身上的某个方法,当用户触发某个行为时,

DOM事件: DOM事件级别、DOM事件流、DOM事件模型、DOM事件捕获过程、自定义事件

前端面试中只要问到事件,就肯定会有DOM事件:如果回答出来了,就会一直向下延申,其实这些东西都很简单,但我第一次被问到的时候,也是懵的: DOM事件级别: DOM0 element.onclick = function() { } DOM1 一般只有设计规范,没有设计跟事件相关的东西:所以直接跳过 DOM2 element.addEventListener(‘click’, function() { }, false) DOM3 element.addEventLIstener(‘keyup’,

Vue事件在组件中的简单使用以及子组件事件触发父组件自定义事件

在Vue中,通过v-on 来监听DOM事件,可以通过@简写代替. 一个简单的在组件中的事件调用示例 在template的Html中使用v-on或@监听一个click事件,并指定事件执行handleClick方法. handleClick需要在组件的methods集合中定义. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta

通过c# 实现自定义属性改变触发自定义事件 ,理解自定义事件及其触发过程

以下说明可解释自定义的事件的自定义触发过程: 直接上代码,内含说明(界面是两个文本框textbox1,textbox2,和一个button1,界面的Load事件,button的click事件) Form1 类(调用者端) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; us

详解javascript实现自定义事件

这篇文章主要为大家介绍了javascript实现自定义事件的方法,自定义事件,顾名思义,就是自己定义事件类型,自己定义事件处理函数,javascript如何实现自定义事件,需要了解的朋友可以参考下 我们平时在操作dom时候经常会用到onclick,onmouseover等一系列浏览器特定行为的事件, 那么自定义事件,顾名思义,就是自己定义事件类型,自己定义事件处理函数,在合适的时候需要哪个事件类型,就去调用哪个处理程序 1.js所支持的浏览器默认事件 浏览器特定行为的事件,或者叫系统事件,js默

JavaScript自定义事件 - createEvent()、initEvent()和dispachEvent()

参考资料: MDN - Document.createEvent():https://developer.mozilla.org/zh-CN/docs/Web/API/Document/createEvent MDN - Event.initEvent():https://developer.mozilla.org/zh-CN/docs/Web/API/Event/initEvent MDN - 创建和触发events:https://developer.mozilla.org/zh-CN/do

javascript和jquey的自定义事件小结

“通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用对象B的某个方法,实现交互:直接方法调用本质上也是属于一种特殊的发送与接受消息,它把发送消息和接收消息合并为一个动作完成: 方法调用方和被调用方被紧密耦合在一起:因为发送消息和接收消息是在一个动作内完成,所以无法做到消息的异步发送和接收: 2)对象A生成消息->将消息通知给一个事件消息处理器(Obs

Javascript框架的自定义事件(转)

很多 javascript 框架都提供了自定义事件(custom events),例如 jquery.yui 以及 dojo 都支持"document ready"事件.而部分自定义事件是源自回调(callback). 回调将多个事件句柄存储在数组中,当满足触发条件时,回调系统则会从数组中获取对应的句柄并执行.那么,这会有什么陷阱呢?在回答这个问题之前,我们先看下代码. 下面是两段代码依次绑定到 domcontentloaded 事件中 document.addeventlistene