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 ...
随机推荐
- 文章导航-readme
Spring-Boot Spring Boot(一) Hello World Redis 图解Redis之数据结构篇--简单动态字符串SDS 图解Redis之数据结构篇--链表 图解Redis之数据结 ...
- Hadoop核心组件之YARN
YARN概述 Yet Another Resource Negotiator:另外资源的协调者 通用的资源管理系统 为上层应用提供统一的资源管理和调度 操作系统级别的调度框架,可以让各种计算框架运行在 ...
- Java中Synchronized的优化原理
我们知道,从 JDK1.6 开始,Java 对 Synchronized 同步锁做了充分的优化,甚至在某些场景下,它的性能已经超越了 Lock 同步锁.那么就让我们来看看,它究竟是如何优化的. 原本的 ...
- Kotlin学习系列(二)
IF表达式 if在kotlin可以当做表达式使用跟java的三元操作符类似: var max = if( a > b ) a else b if分支可以使用代码块,最后一个表达式是返回值: va ...
- Mycat 配置文件rule.xml
rule.xml配置文件定义了我们对表进行拆分所涉及到的规则定义.我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同. 该文件里面主要有tableRule和function这 ...
- springboot结合mybatis使用pageHelper插件进行分页查询
1.pom相关依赖引入 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...
- PLSQL常用设置-提高开发效率
1.登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如果你登录的用户是dba,要展开tables目录,正常情况都需 ...
- Java 学习笔记之 Daemon线程
Daemon线程: 线程: 用户线程 守护线程 守护线程是一种特殊的线程,在进程中不存在非守护线程了,则守护线程自动销毁. public class DaemonThread extends Thre ...
- [TLSR8267] 泰凌微 telink tlsr8267 ble ADC 用法浅谈
1.读 datasheet 在<DS_TLSR8267-E21_Datasheet for Telink BLE SoC TLSR8267.pdf>第11章详细介绍了ADC相关属性及参数. ...
- 虚拟机安装Centos7系统后优化操作
重点说明 以下操作针对于VMware软件上新创建的Centos7的虚拟机的优化,当需要多台虚拟机的实验环境时,可通过以下需求先操作配置出一台优化机(也可称为模板机),并创建快照记录,以后的多台虚拟机环 ...