事件--c#
以上是事件的几个操作。
事件由五个组件构成:
具体作用如下:
事件声明:
event 委托类型 事件名;例子:
public event EventHandler Elapsed;
还可同时声明几个事件:
public event EventHandler Event1,Event2,Event3;
还可添加static使得事件静态。
事件说明
事件是成员,不是类型,所以不能通过new来创建他的对象。
由于是成员:
1,他必须声明在类或者结构中,和其他成员一样。
2,不能在一段可执行代码中声明事件。
委托类型和eventhandler。
事件必须要有委托类型,我们可以声明一个委托类型或者使用一个已经存在的。
如果声明一个类型,必须指定方法保存的签名和返回类型。
更好的办法是,使用eventhandler。
public delegate void Eventhandler(Object obj,EventArgs e);
事件触发
事件触发和委托一样,都是:事件名(参数,参数);
触发事件必须先判断事件是否null,确认有方法可以执行。
例如:
if(Elapsed!=null)
Elapsed(sourse,args);
把事件声明和触发事件代码放在一起,便有了如下发布者类声明。该代码保护两个成员,事件和一个叫onOneSecond()方法。它触发了事件。
public class MyTimerClass
{
public event EventHandler Elapse;
private void onOneSecond(object obj,EventArgs args)
{
if(Elapse!=null)
Elapse(obj,args); //发起事件。
}
//下面的代码确认每1秒调用一次onOneSecond()方法。
}
记住两点:
1)发布者类有一个作为成员的事件,
2)类包含了触发事件的代码。
事件订阅方式:
要为事件添加事件处理程序,处理程序必须和委托有一样返回值类型和签名。
使用+=运算符为事件增加事件处理程序。
方法可以是下面任何一个:
1)实例方法 2)静态方法 3)匿名方法 4)lambda表达式。
下面代码为Elapsed事件增加三个方法。
类 mc.Elapsed+=ca.TimerHandlerA; 实例方法 mc.Elapsed+=classB.TimerHandlerB; 静态方法 mc.Elapsed+=new EventHandler(cc.TimerHandlerC); 委托形式。
和委托一样,我们可以使用匿名方法和lambda表达式来增加事件处理程序。例如,如下代码先使用lambda表达式后使用了匿名方法。
mc.Elapsed+=(source,args)=>
{
Console.WriteLine("lambda expression");
}
mc.Elapsed+=delegate(object source,EventArgs args)
{
Console.WriteLine("anonymous method");
}
如下程序使用了他之前定义的MyTimerClass类。
1)他从两个不同实例注册两个事件处理程序。
2)注册事件后休眠2秒,这段时间计时器会触发两次事件,两个事件每次都会执行。
事件移除程序:
使用-=符合移除事件处理。
MC.Elapsed-=CA.TimerHandlerA;
标准事件用法
事件使用标准模式的跟本是eventhandler委托类型。eventhandler委托类型的声明如下代码所示:
1)第一个参数用来保存触发事件的对象的引用。由于是object类型,所以可以匹配任何类型的实例。
2)第二个参数保存有关状态用于应用程序来说是否合适的状态信息。
public delegate void eventhandler(object sender,eventargs e);
eventargs用于传递数据,但是被设计成不能传递任何数据。
如果你希望传递数据,必须设计一个eventargs继承的类。使用合适的字段保存需要传递的数据。
通过扩展eventargs 来传递数据。
我们需要 声明一个派生自eventArgs的自定义类。类的名称应该以EventArgs结尾。
public class MyTCEventArgs : EventArgs
{
public string Message;
public MyTCEventArgs(string s)
{
Message = s;
}
}
使用自定义委托
既然有了一个自定义类,就可以传递数据了。我们需要一个委托类型来使用新的自定义类。实现方式如下:
第一种方式是非泛型委托:
1)创建一个自定义委托。
2)在代码的其他部分使用新的委托名称。
public delegate void MyTCEventHandler (object sender,MyTCEventArgs e);
自定义委托名 自定义类
第二种方式是泛型委托:
1)在方括号中放置自定义类。
2)无论哪里使用自定义委托名称,都使用完整的字符串。例如,event声明是这样的:
public event EventHandler<MyTCEventArgs> Elapsed;
自定义类的泛型委托 事件名
如下是一种泛型委托实现例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace ConsoleApplication5
{
public class MyTCEventArgs : EventArgs //自定义类声明
{
public string Message;
public MyTCEventArgs(string s)
{
Message = s;
}
}
public class MyTimerClass //事件声明及发起事件的代码
{
public event EventHandler<MyTCEventArgs> Elapsed; //使用泛型委托声明事件
private void OnOneSecond(object obj, EventArgs e)
{
if (Elapsed != null)
{
MyTCEventArgs mtcea=
new MyTCEventArgs("Message from Onesecond");
Elapsed(obj, mtcea); //因为事件是EventHandler<MyTCEventArgs>声明的,而EventHandler<MyTCEventArgs>是一个委托类型,所以Elapsed的参数个数跟EventHandler<MyTCEventArgs>一样,
//转到定义可以看到 public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);有两个参数,所以事件Elapsed也有两个参数,且相互对应。
}
}
}
class classA //事件处理程序
{
public void TimerHandlerA(Object obj, MyTCEventArgs e)
{
Console.WriteLine("classA message {0}", e.Message);
}
}
class Program
{
static void Main(string[] args)
{
classA ca = new classA();
MyTimerClass mc = new MyTimerClass(); mc.Elapsed += new EventHandler<MyTCEventArgs>(ca.TimerHandlerA); //事件注册程序 Thread.Sleep(); Console.ReadLine();
}
}
}
这里的OnOneSecond()方法是System.Timer类的方法,会自动隔一段时间被触发运行一次。
事件--c#的更多相关文章
- JNI详解---从不懂到理解
转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- 关于 Chrome 浏览器中 onresize 事件的 Bug
我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- C++中的事件分发
本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...
- 移动端IOS点击事件失效解决方案
解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...
- Android笔记——Button点击事件几种写法
Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...
- HTML 事件(一) 事件的介绍
本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...
- HTML 事件(二) 事件的注册与注销
本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
随机推荐
- 使用Autodesk OAuth服务在用户认证的示例
大家知道以Autodesk 360为核心的Autodesk 云服务已经陆续发布,ReCap API.InfraWorks API和PLM 360 REST API已经开始的Pilot项目供第三方开发者 ...
- 不直接登录SharePoint服务器,通过远程直接部署WSP解决方案包
在这之前不得不说一下Sysinternals,他最初是一个网站,网站上会经常发布一些有用的系统扩展工具,之后运营这个网站的公司被微软收购.像非常著名的Procmon,AutoRuns.Process ...
- AES加密解密
AES简介 美国国家标准技术研究所在2001年发布了高级加密标准(AES).AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准. 根据使用的密码长度,AES最常见的有3种密钥方案,用以适应 ...
- unity安卓和IOS读写目录
StreamingAssets文件夹下的只读不可写路径: 安卓读:filePath = Application.streamingAssetsPath + "/文件名.格式名"; ...
- Android无线开发的几种常用技术(阿里巴巴资深工程师原创分享)
完整的开发一个android移动App需要经过从分解需求.架构设计到开发调试.测试.上线发布等多个阶段,在发布后还会有产品功能上的迭代演进,此外还会面对性能.安全.无线网络质量等多方面的问题. 移动A ...
- Tomcat:云环境下的Tomcat设计思路——Tomcat的多实例安装
Cloud现在是一个热门的技术,Tomcat是学习Java的人一般都会接触的Web服务器,如果在Cloud环境下使用Tomcat,又当如何呢?不可避免的,要安装多个Tomcat了,这里称之为Tomca ...
- NGINX高性能Web服务器详解(读书笔记)
原文地址:NGINX高性能Web服务器详解(读书笔记) 作者:夏寥寥 第4章 Nginx服务器的高级配置 4.1 针对IPv4的内核7个参数的配置优化 说明:我们可以将这些内核参数的值追加到Linu ...
- Java Override/Overload
重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能 ...
- WebService 实例
使用Java WebService API实现 1.服务端接口: package com.h3c.itac.webservice; import javax.jws.WebService; @WebS ...
- python入门综合
#!/usr/bin/env python#-*-coding:utf-8-*- #以上是配置编写环境的开始 #第一行env表示运行当前环境变量内的python版本(2.x or 3.x)#第二行 ...