关于c#的事件如何使用
c#的委托delegate事件的详细使用
一、无参数,无返回的委托事件
委托事件类、事件的发生源。1.声明委托 2定义事件 3具体方法
public class Test
{
// ….
public delegate void TestHandler();//无参数,无返回委托
public event TestHandler TestEvent;//事件
public void OnTestHandler()//调用
{
if(TestEvent != null) //不等于null 说明该事件已经注册有函数
{
this.TestEvent();
}
}
}
调用触发事件方法(这里把注册和调用写在一起,实际可以把注册写在另外的类)
class Program
{
3 static void Main(string[] args)
4 {
Test model = new Test();//实列
6 model.TestEvent += model_TestEvent;//为model 注册TestEvent事件的执行方法
model.OnTestHandler();//调用引发事件
}
static void model_TestEvent()//事件执行方法,该方法样式要与委托一致(参数,返回值)
10 {
11 Console.WriteLine("这是最简单的事件");
}
}
执行效果

补充1、委托链。通过+= 添加执行函数。
model.TestEvent += model_TestEvent;//为model 注册TestEvent事件的执行方法,符合TestHandler委托样式(参数,返回值)的方法都可以进行注册,可注册多个函数,按顺序执行。如改为
model.TestEvent += model_TestEvent1;
//model.TestEvent += new Test.TestHandler(model_TestEvent1);也可以这样写
model.TestEvent += model_TestEvent2;
static void model_TestEvent1()
{
Console.WriteLine("这是事件的函数1");
}//可设置断点看执行顺序
static void model_TestEvent2()
{
Console.WriteLine("这是事件的函数2");
}
执行效果

补充2、委托事件 结合在发布订阅者模式中。
Main(string[] args)方法中我们进行了注册和调用,像观察者模式使用,就会把注册和调用进行分开。
注册类,也就是所谓的订阅类。该类也可以写成接口,给不同业务的监听者用来继承扩张,这里所有监听者都执行model_TestEvent()函数。
public class Listeners
{
//注册
public void registerEvent(Test model)
{
model.TestEvent += newTest.TestHandler(model_TestEvent);
}
//注销
public void nullifyEvent(Test model)
{
model.TestEvent -= newTest.TestHandler(model_TestEvent);
}
public virtual void model_TestEvent()
{
Console.WriteLine("这是所有监听者要执行的函数");
}
}
这里原来是注册事件,现在改为实例,注册监听者。。
static void Main(string[] args)
{
Test model = new Test();
//可以实例注册多个监听者
Listeners listener1 = new Listeners();
Listeners listener2 = new Listeners();
listener1.registerEvent(model);
8 listener2.registerEvent(model); model.OnTestHandler(); //事件触发后,会向所有注册的监听者发送,所有监听者执行函数model_TestEvent
11 }
执行效果

二、带参数、返回值的委托事件
首先定义事件的参数,这是自定义事件传入的参数,从Eventargs继承,也可直接用Eventargs,这里为了简单就只给了个string字段,利用构造函数赋值。
一般带返回的委托事件,不会采用+=,因为委托链的话,非void,会忽略前面的函数,只会返回最后一个函数的结果。
public class TestEventArgs : EventArgs
{
public string parameters;
public TestEventArgs(string par)
{
6 parameters = par;
}
}
委托事件类
public class Test
{
3 public delegate string TestHandler(object sender, TestEventArgs tea);//带参数,带返回的委托
4 public event TestHandler TestEvent; //定义事件
5 public string OnTestEvent(TestEventArgs tea)//调用
6 {
7 if (TestEvent != null)
8 {
return TestEvent(this,tea);
}
return null;
12 }
}
注册触发
static void Main(string[] args)
{
Test model = new Test();
model.TestEvent += model_TestEvent;//注册事件
5 TestEventArgs tea = new TestEventArgs("test");//事件传入参数
6 string result= model.OnTestEvent(tea) ;//事件触发,得到结果
7 Console.WriteLine(result);
}
static string model_TestEvent(object sender, TestEventArgs tea)
{
return "传入的参数是:" +tea.parameters ;
}
补充1、
这里注册和触发同样可以分开,前面的注册类中把model_TestEvent改为
public virtual string model_TestEvent(objectsender,TestEventArgs tea)//事件执行函数
{
return "传入的参数是:" +tea.parameters;
}
class Program
{
7 static void Main(string[] args)
{
9 Test model = new Test();//实例
10 Listeners listener = new Listeners();//实例监听
11 listener.registerEvent(model);//注册
12 TestEventArgs tea = new TestEventArgs("test"); //事件参数
13 string result= model.OnTestEvent(tea);
14 Console.WriteLine(result);
}
}
补充2、
事件参数类型也可以封装,放在Test类内(OnTestEvent改为privte)。在Test类内加多
public string InitEvent(string par)
{
TestEventArgs tea = new TestEventArgs(par);
return OnTestEvent(tea);
}
Main就可以改为
static void Main(string[] args)
{
Test model = new Test();
Listeners listener = new Listeners();
listener.registerEvent(model);//监听者注册到Test.这里如果很多不同业务的监听者的话,如何返回所有监听者处理完的信息。修改Listeners类?(单例,管理者类)。
string result = model.InitEvent("test");
Console.WriteLine(result);
}
完毕!多多指教。
关于c#的事件如何使用的更多相关文章
- JNI详解---从不懂到理解
转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- 关于 Chrome 浏览器中 onresize 事件的 Bug
我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- C++中的事件分发
本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...
- 移动端IOS点击事件失效解决方案
解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...
- Android笔记——Button点击事件几种写法
Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...
- HTML 事件(一) 事件的介绍
本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...
- HTML 事件(二) 事件的注册与注销
本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
随机推荐
- Git——2
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...
- [转]CAP原理与最终一致性 强一致性 透析
在足球比赛里,一个球员在一场比赛中进三个球,称之为帽子戏法(Hat-trick).在分布式数据系统中,也有一个帽子原理(CAP Theorem),不过此帽子非彼帽子.CAP原理中,有三个要素: 一致性 ...
- DIY的.net正则表达式工具
基本包括了常用的正则表达式测试工作. 对应.net Framework 2.0版本 VB.NET编写 百度网盘下载:http://pan.baidu.com/s/1eQAHnlo 包含源码. 在下一个 ...
- ZYNQ学习之二-EMIO
---恢复内容开始--- 本次试验学习和掌握zynq的emio的使用,是通过PS控制PL端的GPIO. 1.创建硬件工程,主要就是添加EMIO就可以.当然了创建工程的时候还要注意DDR的设置,根据自己 ...
- 安装Nginx作为Windows服务自启动运行
如果Nginx每次使用都需要手动启动确实很麻烦,所以最好将其设置为Windows系统服务,开机自启动就行了. 1.下载并修改运行环境支持程序 1).下载地址:http://ng-srvinst.att ...
- 初级Bug率,随时受不了
一听到初级Bug这个名字,很多开发工程师都会觉得很头痛,还有那个“初级Bug率”,让人随时受不了. 初级Bug这个概念,在多数缺陷跟踪工具中,是不存在的,可以说是淘宝研发部的特色.初级Bug对应Bug ...
- 将Java应用程序打包成可执行的Jar包
可以将多个class文件打包为jar包,在指定程序入口点情况下,可以用 java –jar jar包名称 的方式调用jar包内主类的main函数. 程序源代码如下: //Math.java publi ...
- range for query
static void range_test(Args _args) { Query Query; QueryRun QueryRun ...
- Spark Streaming中空RDD处理及流处理程序优雅的停止
本期内容 : Spark Streaming中的空RDD处理 Spark Streaming程序的停止 由于Spark Streaming的每个BatchDuration都会不断的产生RDD,空RDD ...
- JavaScript中的分支结构
说到JavaScript中的分支结构,我们就不得不提到流程控制这个词,我们所有的程序都是由数据和算法组成的.程序=数据+算法通常我们所说的算法都可以通过"顺序","分支& ...