C#事件浅淡(1)
最近在写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)的更多相关文章
- 浅淡Webservice、WSDL三种服务访问的方式(附案例)
Webservice Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术. eg:站点提供访问的数据接口:新浪微博.淘宝. 官方解释:它是一种构建应用程序的普遍模型,可以在任 ...
- 浅淡fhq_Treap
浅淡 \(fhq\_Treap\) 前言 fhq_Treap \(yyds\)! \(sto\ FHQ\ orz\) 机房大佬们都打的 \(Splay\) 只有蒟蒻打的 \(fhq\) (防火墙)(范 ...
- 转:asp.net TreeView CheckChanged 事件浅谈
http://blog.csdn.net/xiage/article/details/5128755 在开发中经常可以碰到类似的问题: 想通过一个树父节点的TreeNodeCheckChanged 事 ...
- 浅淡HTML5移动Web开发
说实话,我们这次开发移动端的项目,整个项目组的人都是第一次,最初立项的时候为是选择native app和web app还争论了一番,最后综合考虑,我们选择了web(我们选择了h5)开发.但从这两种开发 ...
- html5 drag 文件拖拽浅淡
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python: 浅淡Python中的属性(property)
起源:项目过程中需要研究youtube_dl这个开源组件,翻阅其中对类的使用,对比c#及Delphi中实现,感觉Python属性机制挺有意思.区别与高级编程语言之单一入口,在类之属性这一方面,它随意的 ...
- C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈
研究了一下KeyDown,KeyPress 和 KeyUp 的学问.让我们带着如下问题来说明: 1.这三个事件的顺序是怎么样的? 2.KeyDown 触发后,KeyUp是不是一定触发? 3.三个事件的 ...
- 浅淡 RxJS WebSocket
const open$ = new Subject(); const ws = webSocket({ url: 'wss://echo.websocket.org', openObserver: o ...
- DoNet:浅淡对delegate的理解
1 前言 C#的相关文档,MSDN上其实已经很详细了,关于delegate的使用可以参 考MSDN上的文档https://msdn.microsoft.com/zh-cn/library/900fyy ...
随机推荐
- [Spark] 08 - Structured Streaming
基本了解 响应更快,对过去的架构进行了全新的设计和处理. 核心思想:将实时数据流视为一张正在不断添加数据的表. 一.微批处理(默认) 写日志操作 保证一致性. 因为要写入日子操作,每次进行微批处理之前 ...
- python unittest+parameterized,单元测试框架+参数化
总要写新的自动化测试模块,在这里把demo记录下来,后面方便自己直接复制粘贴 from nose_parameterized import parameterized import unittest ...
- Spotlight性能监控工具的配置及使用
这是我离线整理资料里的内容,大概是2012年时候开始使用此性能监控工具的,直到至今,接触到几个性能监控工具里,还是美国quest公司生产的Spotlight此产品相对比较牛! 我也不知道现在发展到能支 ...
- java -PDF添加文本水印与图片水印
java pdf添加水印文本及图片文本 PDF文件添加文本水印: private static int interval = 30; public static void waterMark(Stri ...
- 10秒钟理解react生命周期
慎点!这是一篇很水很水的文章, 抄自react中文文档, 本文详细介绍了react生命周期函数执行顺序, 以及各生命周期函数的含义和具体作用. 不同阶段生命周期函数执行顺序 挂载(Mounting) ...
- 使用VirtualBox虚拟机搭建hadoop运行环境,
最近学了一下大数据,包括hadoop环境的搭建,搭建工具:centos6.5,hadoop2.6.4,eclipse Mars.1 Release (4.5.1),jdk1.8 第一步.网络与ip地址 ...
- j2ee开发之Spring2.5框架学习笔记
Spring 2.5框架学习笔记 1.是一个开源的控制反转IOC和面向切面AOP的容器框架 2.IOC控制反转 public class PersonServiceBean { private Per ...
- java之ReentrantLock详解
前言 如果一个代码块被synchronized修饰了,当一个线程获取了相应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的释放,现在有这么一种情况,这个获取锁的线程由于要等待IO或者其他原 ...
- ini 文件操作指南
今天总结一篇工具箱文章. ini 类型文件通常作为程序的初始化文件.不同于我们常见的配置文件通篇 key-value 的键值对形式,ini 文件在键值对的基础之上还有分类节点,比如我们常见的 Mysq ...
- MOV与LEA
MOV 格式:MOV dest, src 作用:赋值,且不改变标记位的值 特点:可以从寄存器到寄存器.从立即数到寄存器.从存储单元到寄存器.从立即数到储存单元.从寄存器到存储单元.从寄存器或存储单元到 ...