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 ...
随机推荐
- centos下U盘重装windows
当前机器使用的都是centos系统,后来想使用windows,这时候就需要在centos下去安装windows系统啦. 当然是采用U盘安装啦,先准备U盘,U盘数据先备份以免丢失. 第一步:制作U盘启动 ...
- kafka删除弃用的groupid
登录zookeeper客户端 cd zookeeper-3.4.10 sh zkCli.sh 查看groupid信息 [zk:localhost:2181(CONNECTED) 1] ls /cons ...
- 手把手教你搭建Pytest+Allure2.X环境详细教程,生成让你一见钟情的测试报告(非常详细,非常实用)
简介 宏哥之前在做接口自动化的时候,用的测试报告是HTMLTestRunner,虽说自定义模板后能满足基本诉求,但是仍显得不够档次,高端,大气,遂想用其他优秀的report框架替换之.一次偶然的机会, ...
- SpringBootSecurity学习(10)网页版登录之记住我功能
场景 很多登录都有记住我这个功能,在用户登陆一次以后,系统会记住用户一段时间,在这段时间,用户不用反复登陆就可以使用我们的系统.记住用户功能的基本原理如下图: 用户登录的时候,请求发送给过滤器User ...
- maven war包打包去除jar包瘦身
1.pom文件配置 <!-- war包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> ...
- Spring Boot 2.x基础教程:JSR-303实现请求参数校验
请求参数的校验是很多新手开发非常容易犯错,或存在较多改进点的常见场景.比较常见的问题主要表现在以下几个方面: 仅依靠前端框架解决参数校验,缺失服务端的校验.这种情况常见于需要同时开发前后端的时候,虽然 ...
- Git基础概念与Flow流程介绍
目录 Git相关 基本概念 常见客户端 TortoiseGit Sourcetree Intellij Idea 命令行 常用命令 存储区域 命令之 add & commit &pus ...
- Redis未授权访问漏洞复现
Redis未授权访问漏洞复现 一.漏洞描述 Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没 ...
- 介绍ArcGIS中各种数据的打开方法——shp(矢量文件)
2.加载shp文件到地图控件 ShapeFile是一种矢量数据模型的计算机数据组织文件,用于在计算机上表达矢量数据的计算机文件. 加载ShapeFile文件最主要是:axMapControll控件对象 ...
- SystemMetrics
头文件: #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))struct { int iIndex ; TCHAR ...