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 ...
随机推荐
- [C++] 重载运算符与类型转换(2)——函数调用运算符和类型转换运算符
1.这两个应该是C++中比较高级的用法了. 一.函数调用运算符 1.重载函数调用运算符(),必须是成员函数,一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或者类型上有所区别. ...
- 首次GitHub千星项目提交维护成功 留念
现在有点激动,可能有混乱的地方.请大家见谅. 一直觉得千星项目,对我来说是一个遥不可及的地方.没想到第一次在GitHub上 提交Pull Request 就成功了,并且是一个千星项目. 虽然 只是提出 ...
- elasticsearch倒排索引与TF-IDF算法
elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.倒排索引(Inverted Index)简介 在关系 ...
- Python日志产生器
Python日志产生器 写在前面 有的时候,可能就是我们做实时数据收集的时候,会有一个头疼的问题就是,你会发现,你可能一下子,没有日志的数据源.所以,我们可以简单使用python脚本来实现产生实时的数 ...
- Linux 常用解压和压缩命令
.tar 解包 tar xvf filename.tar.tar 打包 tar cvf filename.tar dirname.gz 解压1 gunzip filename.gz.gz 解压2 gz ...
- MYSQL-用户密码修改
解决方法如下:1.终端中结束当前正在运行的mysql进程.# sudo /etc/init.d/mysql stop2.用mysql安全模式运行并跳过权限验证.# sudo /usr/bin/mysq ...
- Java基础学习笔记(二) - 面向对象基础
面向对象 一.面向对象概述 面向对象思想就是在计算机程序设计过程中,参照现实事物,将事物的属性特征.行为特征抽象出来,描述成计算机时间的设计思想.面向对象思想区别于面向过程思想,强调的是通过调用对象的 ...
- Forest plot(森林图) | Cox生存分析可视化
本文首发于“生信补给站”微信公众号,https://mp.weixin.qq.com/s/2W1W-8JKTM4S4nml3VF51w 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号 ...
- Linux Shell 基础知识(二)
1.本文知识结构 2.文件的查询与检索 2.1. cd 目录切换 找到文件/目录位置:cd 切换到上一个工作目录: cd - 切换到home目录: cd or cd ~ 显示当前路径: pwd 更改当 ...
- 教你制作挂件头像 | 小程序七十二变之 canvas 绘制国旗头像
昨天朋友圈被「请给我一面国旗@微信官方」刷屏,虽然知道是假的,但是从另一个角度来看,弄清楚如何实现更有趣. 1.canvas 这就不得不提到小程序中的 API canvas,H5 中也是有 canva ...