以上是事件的几个操作。

事件由五个组件构成:

具体作用如下:

事件声明:

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#的更多相关文章

  1. JNI详解---从不懂到理解

    转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...

  2. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  3. 关于 Chrome 浏览器中 onresize 事件的 Bug

    我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...

  4. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  5. C++中的事件分发

    本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...

  6. 移动端IOS点击事件失效解决方案

    解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...

  7. Android笔记——Button点击事件几种写法

    Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...

  8. HTML 事件(一) 事件的介绍

    本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...

  9. HTML 事件(二) 事件的注册与注销

    本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...

  10. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

随机推荐

  1. 深入.net(多态二)

    代码优化技术: 通过“继承”技术,实现代码的复用,减少代码的编写量. 因为子类继承父类,拥有了父类所有对外公开“属性”和“方法”,所以,在系统中,完全可以由子类替代父类(里氏替换原则)!在替代的过程中 ...

  2. UITableView代理方知多少+执行顺序

    一.前言 iOS中UITableView是最常用的一个控件.看了一下UITableView的代理:UITableViewDelegate 和 UITableViewDataSource.其中UITab ...

  3. iOS如何获取网络图片(二)

    ios如何获取图片(二)无沙盒下 解决问题 *解决问题1:tableView滑动卡顿,图片延时加载 解决方法:添加异步请求,在子线程里请求网络,在主线程刷新UI *解决问题2:反复请求网络图片,增加用 ...

  4. OS开发UI篇—使用UItableview完成一个简单的QQ好友列表

    本文转自:http://www.cnblogs.com/wendingding/p/3763330.html 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableVi ...

  5. 最新中国菜刀caidao-20160620下载和说明

    0x00 中国制造, 黑客之刀 中国菜刀是中国安全圈内使用非常广泛的一款Webshell管理工具,此次老兵大牛进行了更新,界面更加优美,功能更加丰富,有图有真相! 0x01 验证 此次更新还自带了官网 ...

  6. BIEE 目录迁移(文件夹)方式

    文件夹迁移方式一(归档--取消归档):     归档:analytics中选择目录,定位至指定文件夹,更多中选择归档,保存为 .catalog文档:     释放归档: 进入目录管理器,离线方式登陆, ...

  7. [Linux 性能检测工具]DF

    DF NAME: df 报告了文件系统的使用 语法: df [OPTION]... [FILE]... 描述: Df显示了以文件名为从参数查看所在文件系统的可用空间.如果没有指定文件那么会显示所有的文 ...

  8. Tomcat源码解读:ClassLoader的设计

    Tomcat是一个经典的web server,学习tomcat的源码对于我们是有很大的帮助的.前一段时间了解了tomcat的工作的大致流程,对我的新工作有了很大的帮助.刚学习了ClassLoader( ...

  9. SSRS 的简单使用(一)

    简介 SQL Server Reporting Services(SSRS),微软企业级报表平台,和SQL Server Integration Service以及SQL Server Analysi ...

  10. SQL 笔记

    --查询某一列在哪个表里 SELECT name , object_id , type , type_desc FROM sys.objects WHERE object_id IN ( SELECT ...