关于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 ...
随机推荐
- ubuntu 13.10 mono asp.net服务 安装
ubuntu 13.10 从官方文档http://www.mono-project.com/Mod_mono 可看到 Mod_Mono is an Apache 2.0/2.2/2.4.3 modul ...
- C# 6.0可能的新特性及C#发展历程
据扯,C# 6.0在不远的将来就发布了,对应的IDE可能是VS 2014(.Net Framework 5.0),因为VS 2013已于2013年10月份发布了,对应的是.Net Franework ...
- jquery文件上传控件 Uploadify
(转自 http://www.cnblogs.com/mofish/archive/2012/11/30/2796698.html) 基于jquery的文件上传控件,支持ajax无刷新上传,多个文件同 ...
- Commons-Collections 集合工具类的使用
package com.bjsxt.others.commons; import java.util.ArrayList; import java.util.List; import org.apac ...
- RabbitMQ消息机制单人分发
static void Main(string[] args) { // More.SendMessage(); var factory = new ConnectionFactory(); fact ...
- 优化servlet
在最开始的时候我们写一个servlet(LoginServlet)对应一个请求(Login.jsp),这样的话就会产生很多的servlet,使其以后维护变得麻烦,所以我们可以考虑将同一类型(Login ...
- 4T_进程与进程间通信
∮进程 进程与程序 进程与程序是有区别的.刚吃完炸鸡腿,拿出一张餐巾纸,擦完嘴之后,在油乎乎的纸上写下以下文字 #include <stdio.h> void main() { print ...
- Python-any函数和all函数
any函数: any(x),只要x中有一个不为空,0,false就返回True,否则返回False all(x)函数 必须x中的所有元素均不为空,0,false才会返回True,否则返回False & ...
- 在Android中自定义捕获Application全局异常,可以替换掉系统的强制退出对话框(很有参考价值与实用价值)
转载自: http://blog.csdn.net/jdsjlzx/article/details/7606423
- 操作系统 页面置换算法LRU和FIFO
LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...