以上是事件的几个操作。

事件由五个组件构成:

具体作用如下:

事件声明:

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. 使用Autodesk OAuth服务在用户认证的示例

    大家知道以Autodesk 360为核心的Autodesk 云服务已经陆续发布,ReCap API.InfraWorks API和PLM 360 REST API已经开始的Pilot项目供第三方开发者 ...

  2. 不直接登录SharePoint服务器,通过远程直接部署WSP解决方案包

    在这之前不得不说一下Sysinternals,他最初是一个网站,网站上会经常发布一些有用的系统扩展工具,之后运营这个网站的公司被微软收购.像非常著名的Procmon,AutoRuns.Process ...

  3. AES加密解密

    AES简介 美国国家标准技术研究所在2001年发布了高级加密标准(AES).AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准. 根据使用的密码长度,AES最常见的有3种密钥方案,用以适应 ...

  4. unity安卓和IOS读写目录

    StreamingAssets文件夹下的只读不可写路径: 安卓读:filePath = Application.streamingAssetsPath + "/文件名.格式名"; ...

  5. Android无线开发的几种常用技术(阿里巴巴资深工程师原创分享)

    完整的开发一个android移动App需要经过从分解需求.架构设计到开发调试.测试.上线发布等多个阶段,在发布后还会有产品功能上的迭代演进,此外还会面对性能.安全.无线网络质量等多方面的问题. 移动A ...

  6. Tomcat:云环境下的Tomcat设计思路——Tomcat的多实例安装

    Cloud现在是一个热门的技术,Tomcat是学习Java的人一般都会接触的Web服务器,如果在Cloud环境下使用Tomcat,又当如何呢?不可避免的,要安装多个Tomcat了,这里称之为Tomca ...

  7. NGINX高性能Web服务器详解(读书笔记)

    原文地址:NGINX高性能Web服务器详解(读书笔记) 作者:夏寥寥 第4章  Nginx服务器的高级配置 4.1 针对IPv4的内核7个参数的配置优化 说明:我们可以将这些内核参数的值追加到Linu ...

  8. Java Override/Overload

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能 ...

  9. WebService 实例

    使用Java WebService API实现 1.服务端接口: package com.h3c.itac.webservice; import javax.jws.WebService; @WebS ...

  10. python入门综合

    #!/usr/bin/env python#-*-coding:utf-8-*- #以上是配置编写环境的开始   #第一行env表示运行当前环境变量内的python版本(2.x or 3.x)#第二行 ...