最近在写C#,感觉事件这个机制很好,可是怎么实现自己定义的事件呢?查了资料有的不全有的不完整,有的太深,自己写一个简单的例子。

原则

1,定义一个事件信息类(标准的都继承EventArgs)

2、定义一个委托(标准的是EventHandler结尾),可以写在命名空间里,类里都行,区别自己查

3、就是定义一个此委托下的一个事件了。

4、事件调用方法(也就是何种情况下调用这个事件,一般都叫On方法,多以On开头)

5、用户处理方法,(一般这个不在事件类里面)

1和2可以没有,下一文章再讲,这里讲一个完整的流程

(1)、定义消息类

  public class PersonEventArgs : EventArgs
{ private int oldAge; public int OldAge
{
get { return oldAge; }
}
public PersonEventArgs(int age)
{
this.oldAge = age;
} }

(2,3,4)、定义事件类

  public delegate void PersonEventHandler(object sender, PersonEventArgs e);
/// <summary>
/// '************************************************
/// //'◇作者:李阳阳
/// //'◇小组:无
/// //'◇说明:事件测试类
/// //'◇版本号:V1.0.0
/// //'◇创建日期:2016/5/10 8:04:51
/// ///'*************************************************
/// </summary>
public class Person
{
public event PersonEventHandler AgeChanged; protected virtual void OnAgeChanged(PersonEventArgs e)
{
if (AgeChanged != null)
{
AgeChanged(this, e);
}
} private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private int age; public int Age
{
get { return age; }
set
{
if (age != value)
{
int orage = age;
age = value;
OnAgeChanged(new PersonEventArgs(orage));
}
}
} public void AddAge(int icrAge)
{
int orage = age;
age += icrAge;
OnAgeChanged(new PersonEventArgs(orage));
} public override string ToString()
{
return string.Format("Name:{0}\t Age:{1}", name, age);
}
public Person()
{
name = "";
age = ;
} public Person(string name, int age)
{
this.name = name;
this.age = age;
// author : lyy : 2016/5/10 8:14:36
// last change :
/// 说明: 可以再这个地方添加一些预处理事件
// this.AgeChanged += new PersonEventHandler(Person_AgeChanged); } void Person_AgeChanged(object sender, PersonEventArgs e)
{
this.name = "我的名了没有变:" + name;
//throw new NotImplementedException();
}
}

(5)事件类的应用

  static void Main(string[] args)
{
Person p = new Person("sb", );
Console.WriteLine(p.ToString());
p.AgeChanged += new PersonEventHandler(p_AgeChanged);
string a = Console.ReadLine();
p.AddAge(int.Parse(a)); Console.WriteLine(p.ToString());
Console.Read();
} static void p_AgeChanged(object sender, PersonEventArgs e)
{
Console.WriteLine("我手动修改了年龄");
Person ptemp = sender as Person;
// author : lyy : 2016/5/10 8:18:50
// last change :
/// 说明: 为了看到效果我们在事件操作中再次更改年龄的值
Console.WriteLine(string.Format("增加后的年龄{0}", ptemp.Age)); Random rd = new Random(); ptemp.Age = rd.Next(,);
Console.WriteLine(string.Format("我在事件中又修改了年龄{0}",ptemp.Age));
// throw new NotImplementedException();
}

6,结果如图:

C#事件浅淡(1)的更多相关文章

  1. 浅淡Webservice、WSDL三种服务访问的方式(附案例)

    Webservice Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术. eg:站点提供访问的数据接口:新浪微博.淘宝. 官方解释:它是一种构建应用程序的普遍模型,可以在任 ...

  2. 浅淡fhq_Treap

    浅淡 \(fhq\_Treap\) 前言 fhq_Treap \(yyds\)! \(sto\ FHQ\ orz\) 机房大佬们都打的 \(Splay\) 只有蒟蒻打的 \(fhq\) (防火墙)(范 ...

  3. 转:asp.net TreeView CheckChanged 事件浅谈

    http://blog.csdn.net/xiage/article/details/5128755 在开发中经常可以碰到类似的问题: 想通过一个树父节点的TreeNodeCheckChanged 事 ...

  4. 浅淡HTML5移动Web开发

    说实话,我们这次开发移动端的项目,整个项目组的人都是第一次,最初立项的时候为是选择native app和web app还争论了一番,最后综合考虑,我们选择了web(我们选择了h5)开发.但从这两种开发 ...

  5. html5 drag 文件拖拽浅淡

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Python: 浅淡Python中的属性(property)

    起源:项目过程中需要研究youtube_dl这个开源组件,翻阅其中对类的使用,对比c#及Delphi中实现,感觉Python属性机制挺有意思.区别与高级编程语言之单一入口,在类之属性这一方面,它随意的 ...

  7. C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈

    研究了一下KeyDown,KeyPress 和 KeyUp 的学问.让我们带着如下问题来说明: 1.这三个事件的顺序是怎么样的? 2.KeyDown 触发后,KeyUp是不是一定触发? 3.三个事件的 ...

  8. 浅淡 RxJS WebSocket

    const open$ = new Subject(); const ws = webSocket({ url: 'wss://echo.websocket.org', openObserver: o ...

  9. DoNet:浅淡对delegate的理解

    1 前言 C#的相关文档,MSDN上其实已经很详细了,关于delegate的使用可以参 考MSDN上的文档https://msdn.microsoft.com/zh-cn/library/900fyy ...

随机推荐

  1. SpringBoot和Hibernate整合

    1.先使用idea创建maven项目(这个就不详细讲了,很简单的操作) 2.创建完maven项目之后添加springboot依赖,pom.xml文件如下: <?xml version=" ...

  2. [C++] 头文件中的#ifndef,#define,#endif以及#pragma用法

    想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文 ...

  3. ECSHOP完美解决Deprecated: preg_replace()报错的问题

    随着PHP5.5 的普及,ECSHOP系统又爆出了新的错误.PHP发展到PHP5.5版本以后,有了很多细微的变化.而ECSHOP官方更新又太慢,发现这些问题后也不及时升级,导致用户安装使用过程中错误百 ...

  4. java算法基础范例

    题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?  1.程序分析: 兔子的规律为数列1,1,2,3 ...

  5. 前端面试题——html与css基础篇

    整理一波html和css的面试题,侧重基础,希望明天面试能用到~(╥╯^╰╥) 一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.C ...

  6. JIRA集成GitHub

    原因: 作为管理员, 为用户提高效率的角度,配置测试此服务.让用户从JIRA内看到代码分支,提交信息,pull requests等等, 让Github的代码提交记录和JIRA的任务管理系统集成在一起, ...

  7. Build step 'Invoke top-level Maven targets' marked build as failure Finished解决

    最近用法 jenkins部署maven项目时候,突然出现Build step 'Invoke top-level Maven targets' marked build as failure Fini ...

  8. 一个原生JS实现的不太成熟的贪吃蛇游戏

    一个初初初初级前端民工 主要是记录一下写过的东西,复习用 大佬们如果看到代码哪里不符合规范,或者有更好写法的,欢迎各位批评指正 十分感谢 实现一个贪吃蛇游戏需要几步? 1.有地图 2.有蛇 3.有食物 ...

  9. Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)

    1.概述 本文将介绍如何基于Spring Boot 2.x的版本,通过Nacos作为配置与注册中心,实现Dubbo服务的注册与消费. 整合组件的版本说明: Spring Boot 2.1.9 Dubb ...

  10. 移动端border-radius的几个BUG

    个人博客: http://mcchen.club 一.Android 2.3 自带浏览器不支持 % 通常我们实现一个正圆只需要border-radius: 50%即可,大致代码如下 .foo { wi ...