以上是事件的几个操作。

事件由五个组件构成:

具体作用如下:

事件声明:

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. LeakCanary中英文文档+使用例子

    Android 开源界最伟(jian)大(zhi)高(kai)效(gua)的公司 Square 又向业界投下一颗重磅炸弹.推出了一个叫 LeakCanary 的玩意儿,可以通过简单粗暴的方式来让开发者 ...

  2. Android 判断SIM卡属于哪个移动运营商

    第一种方法:获取手机的IMSI码,并判断是中国移动\中国联通\中国电信 TelephonyManager telManager = (TelephonyManager) getSystemServic ...

  3. Android Studio教程--Android Studio 2.1安装与配置

    1.下载Android Studio 去官网https://developer.android.com/studio/index.html下载最新版的Android Studio2.1(自备梯子) 或 ...

  4. android fragment 的用法以及与activity的交互和保存数据的方法,包括屏幕切换(转载)!

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 1.管理Fragment回退栈 类似与Android系统为Acti ...

  5. 网络邂逅&网络异步请求

    什么是卡,网络慢,且你只能等着它加载完不能做别的事 这里便引申出网络异步请求的概念 #import "ViewController.h" @interface ViewContro ...

  6. MonoDevelop编辑器中文乱码解决

    说解决乱码分几步,总共分三部! 1. Tools -> Options 2. 3.点击Font->点击TextEditor会出现下边选框,选取喜欢风格并且不乱码即可.

  7. 面试问题4:C语言预处理包括哪些

    问题描述:C语言 预处理包括哪些操作 C语言的三种预处理包括:宏定义(#define).文件包含(#include).条件编译(#if.#else.#endif). 对于宏定义的介绍: 宏定义必须写在 ...

  8. 在【Xamarin+Prism开发详解三:Visual studio 2017 RC初体验】中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很是感兴趣。于是发时间深入研究了一下Visual Studio 2017RC 是不是和微软Connect()://2016上说得一样神。

    总共列出了12点,耐心点慢慢看! 1,添加了不少[代码样式]的设置项目. 通过合理的设置每个人都能写出优美的代码,而且团队项目也可以达到统一代码风格. this首选项:可以设置[字段,属性,方法,事件 ...

  9. (视频) 基于HTML5的服务器远程访问工具

    现在云计算这么发达,基本上每个人都多少有几台Windows或者Linux服务器运行在云端,要直接进入这些服务器进行配置就需要使用类似远程桌面或者Putty这类的工具,虽然大多数Windows电脑都自带 ...

  10. Sql Server之旅——第一站 那些给我们带来福利的系统视图

    本来想这个系列写点什么好呢,后来想想大家作为程序员,用的最多的莫过于数据库了,但是事实上很多像我这样工作在一线的码农,对sql 都一知半解,别谈优化和对数据库底层的认识了,我也是这样... 一:那些系 ...