C# 特性之事件

定义事件:

事件访问修饰符一般为public 定义为公共类型可以使事件对其他类可见

事件定义中还包括委托类型,既可以是自定义委托类型也可以是EventHandler(预定义)

运用"+="运算符来订阅事件,运用"-="运算符来取消订阅事件

例:自定义委托事件

 1  class HelloWorld
 2    {
 3       //定义委托类型
 4       public delegate void Marry(string msg);
 5       //使用自定义委托类型定义事件
 6       public event Marry MarryEvent;
 7        //发出事件
 8        public void News(string msg)
 9        {
10            //判断是否绑定了事件处理方法
11            if(MarryEvent!=null)
12            {
13                //触发事件
14                MarryEvent(msg);
15            }
16
17        }
18       static void Main(string[] args)
19       {
20         //初始化新郎官对象
21           HelloWorld helloWorld=new HelloWorld();
22           //实例化朋友
23           Friend zhangsan=new Friend("Zhangsan");
24           Friend lishi=new Friend("Lishi");
25           Friend zhaoliu=new Friend("Zhaoliu");
26           //订阅事件
27           helloWorld.MarryEvent += new Marry(zhangsan.SendMessage);
28           helloWorld.MarryEvent += new Marry(lishi.SendMessage);
29           helloWorld.MarryEvent += new Marry(zhaoliu.SendMessage);
30           //发出通知
31           helloWorld.News("他要结婚了,到时来");
32           Console.WriteLine("---------------------------------------");
33           //张三取消订阅
34           helloWorld.MarryEvent -= new Marry(zhangsan.SendMessage);
35           //发出通知
36           helloWorld.News("他要结婚了,到时来");
37          Console.ReadKey();
38       }
39    }
40
41     class Friend
42     {
43         //字段
44         public string Name;
45         public Friend(string name)
46         {
47             Name = name;
48         }
49         //事件处理函数,该函数需要符合Marry委托定义
50         public    void SendMessage(string message)
51         {
52             //输出信息
53             Console.WriteLine(message);
54             //对事件做出处理
55             Console.WriteLine("{0}收到了到时准时参加",Name);
56         }
57
58     }

事件的订阅与取消

例:预定义委托事件

 1  class HelloWorld
 2    {
 3       //使用自定义委托类型定义事件
 4       public event EventHandler MarryEvent;
 5        //发出事件
 6        public void News(string msg)
 7        {
 8            //判断是否绑定了事件处理方法
 9            if(MarryEvent!=null)
10            {
11                Console.WriteLine(msg);
12                //触发事件
13                MarryEvent(this,new EventArgs());
14            }
15
16        }
17       static void Main(string[] args)
18       {
19         //初始化新郎官对象
20           HelloWorld helloWorld=new HelloWorld();
21           //实例化朋友
22           Friend zhangsan=new Friend("Zhangsan");
23           Friend lishi=new Friend("Lishi");
24           Friend zhaoliu=new Friend("Zhaoliu");
25           //订阅事件
26           helloWorld.MarryEvent += new EventHandler(zhangsan.SendMessage);
27           helloWorld.MarryEvent += new EventHandler(lishi.SendMessage);
28           helloWorld.MarryEvent += new EventHandler(zhaoliu.SendMessage);
29           //发出通知
30           helloWorld.News("他要结婚了,到时来");
31           Console.WriteLine("---------------------------------------");
32           //张三取消订阅
33           helloWorld.MarryEvent -= new EventHandler(zhangsan.SendMessage);
34           //发出通知
35           helloWorld.News("他要结婚了,到时来");
36          Console.ReadKey();
37       }
38    }
39
40     class Friend
41     {
42         //字段
43         public string Name;
44         public Friend(string name)
45         {
46             Name = name;
47         }
48         //事件处理函数,该函数需要符合Marry委托定义
49         public    void SendMessage(object s,EventArgs e)
50         {
51             //对事件做出处理
52             Console.WriteLine("{0}收到了到时准时参加",Name);
53         }
54
55     }

使用预定义委托事件订阅与取消

运行结果:

在VS中可以用F12查看EventHandler的定义

public delegate void EventHandler(object sender, EventArgs e);

(1)该委托返回类型是void因此实例化委托类型的方法也要满足这点

(2)第一个参数sender负责保存对触发事件对象的引用,其类型为object

(3)第二个参数e保存事件数据,EventArgs类也是.NET类库中定义的类,它不保存任何火数据

时间: 2024-10-11 06:38:13

C# 特性之事件的相关文章

了解JQuery的事件绑定特性和事件命名空间机制,编写更好、更灵活的事件处理代码

JQuery中的bind()和unbind(),提供了事件的绑定和取消机制,既可以绑定html默认支持的事件,也能够绑定自定义的事件.JQuery支持自定义事件,这显然给编程带来了极大的灵活性.下面就一起学习下,jquery事件处理的一些特性. 1.JQuery中事件可以重复绑定,不会覆盖. $("#button1").bind("click",function(){ alert("func1"); }); $("#button1&qu

javascript高级程序设计 第十三章--事件

javascript高级程序设计 第十三章--事件js与HTML的交互就是通过事件实现的,事件就是文档或浏览器窗口中发生的一些特定的交互瞬间. 事件流:事件流描述的是从页面中接收事件的顺序,IE的是事件冒泡流,Netscape的是事件捕获流,这个两个是完全相反的事件流概念. 事件冒泡:由最具体的元素接收,然后逐级向上传播到更高级的节点,即事件沿DOM树向上传播,直到document对象. 事件捕获:不大具体的节点应该更早接收到事件,相当于沿DOM节点树向下级传播直到事件的实际目标,在浏览器中,是

第13章 事件

JavaScript 与HTML 之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软件工程中被称为观察员模式的模型,支持页面的行为(JavaScript 代码)与页面的外观(HTML 和CSS 代码)之间的松散耦合. 13.1 事件流 事件流描述的是从页面中接收事件的顺序.IE 的事件流是事件冒泡流,而Netscape Communicator 的事件流是事件捕获流. 13.1.1

事件对象

1.1 > DOM中的事件对象 1.1.1>兼容DOM的浏览器会将一个event对象传入到事件处理程序中.无论指定事件处理程序时使用什么方法(DOM0级或DOM2级),都会传入event对象. 先来看看下面的实例 1 var btn = document.getElementById("myBtn"); 2 btn.onclick = function(event){ 3 alert(event.type); //click 4 }; 5 6 btn.addEventLis

利用事件委托解决大量循环重复的事件。

假设有个ul,它下面有5000个li; 需求是给这5000个li添加一个点击事件,; 有些人会去这样做 var oUl = document.getElementById('oUl'); var aLi = oUl.getElementsByTagName('li'); var len = aLi.length; for(var i =0;i<len;i++){ (function(index){ aLi[i].onclick = function(){ fn() }; })(i) } 这样做的

js事件冒泡

javaSciprt事件中有两个很重要的特性:事件冒泡以及目标元素. 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这一过程被称为事件冒泡:这个事件从原始元素开始一直冒泡到DOM树的最上层. 目标元素: 任何一个事件的目标元素都是最开始的那个元素,在我们的这个例子中也就是label.使用事件代理的话我们可以把事件处理器添加到一个元素上,等待一个事件从它的子级元素里冒泡上来,并且可以很方便地得知这个事件是从哪个元素开始的. 事

JS 阻止浏览器默认行为和冒泡事件

JS 冒泡事件 首先讲解一下js中preventDefault和stopPropagation两个方法的区别: preventDefault方法的起什么作用呢?我们知道比如<a href="http://www.baidu.com">百度</a>,这是html中最基础的东西,起的作用就是点击百度链接到http://www.baidu.com,这是属于<a>标签的默认行为,而preventDefault方法就是可以阻止它的默认行为的发生而发生其他的事情

关于JavaScript中的事件代理

今天面试某家公司Web前端开发岗位,前面的问题回答的都还算凑活,并且又问了一下昨天面试时做的一道数组去重问题的解题思路(关于数组去重问题,可以观赏我前几天写的:http://www.cnblogs.com/craftsman-gao/p/4766223.html.幸好前几天专门看过这个问题,答题时才能轻松应对啊),因为这些以前都有过研究,所以回答起来并没有太大困难.然而,最后面试官又出了一道代码题让我涨姿势了.题目本身很简单:一个ul中有一千个li,如何给这一千个li绑定一个鼠标点击事件,当鼠标

JavaScript事件 — 事件对象

在触发DOM上的某一个事件的时候,会产生一个事件对象 event ,这个对象记录这和事件有关的一些信息.不管是DOM0级的事件绑定还是DOM2级的事情绑定都会有event对象传入,在通过HTML特性指定事件处理程序的时候,变量event保存这event对象,代码如下琐事: var btn = document.getElementById("button"); btn.onclick = function(event){ console.log(event); //DOM0级绑定事件能