.Net Framework中的标准委托和事件_1
.Net Framework中的标准委托,已经定义在命名空间System中,
namespace System
{
public delegate void EventHandler(object sender, EventArgs e);
}
.Net Framwork类库中的所有事件均基于EventHandler委托。
其中EventArgs参数是可以自定义,必须继承EventArgs类:
public class CustomEventArgs:EventArgs
发布事件有三种方式:
1. 使用.net framework标准委托
public event EventHandler RaiseCustomEvent;
2. 自定义EventArgs参数
public event CustomEventHandler RaiseCustomEvent;
3. 自定义EventArgs参数,泛型的表达方式
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
如何:发布符合.net framework准则的事件
首先分两个类:
1. 发行者类(Publisher),发送Sends(引发Raise)事件的类,这个类做两件事
- 发布事件
- 编写事件的触发程序
窗体(Form)和控件(control)的类中都发布了事件(Load,Click等),事件的触发程序同样能找到,如下:
protected virtual void OnClick(EventArgs e);
2. 订阅者类(Subscriber),接收Receive(处理Handle)事件的类,这个类做两件事
- 注册事件
- 编写事件的处理程序
当你双击Form1中的一个按钮Button1,会直接进入
private void button1_Click(object sender, EventArgs e)
{
}
其实就是在写事件的处理程序;在Form1.Designer.cs中会自动注册按钮双击事件
this.button1.Click += new System.EventHandler(this.button1_Click);
下面来看一个例子,是一个比较标准的方式添加自定义的事件:
namespace DotNetEvents
{
class Program
{
static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub1 = new Subscriber("sub1", pub);
Subscriber sub2 = new Subscriber("sub2", pub); //Call the method that raises the event
pub.DoSomething(); Console.WriteLine("Press Enter to close this window.");
Console.ReadKey();
}
} //Define a class to hold custom event info
public class CustomEventArgs:EventArgs
{
private string message;
public CustomEventArgs (string s)
{
message = s;
}
public string Message
{
get { return message;}
set { message = value; }
}
} //Class that publishes an event
class Publisher
{
//Declare the event using EventHandler<T>
public event EventHandler<CustomEventArgs> RaiseCustomEvent; public void DoSomething()
{
//Write some code that does something useful here
//then raise the event.You can also raise an event
//before you execute a block of code.
OnRaiseCustomEvent(new CustomEventArgs("Did something"));
}
//Wrap event invocations inside a protected virtual method
//to allow derived classes to oveeride the event invocation behavior
protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
{
//Make a temporary copy of the event to avoid possibility of
//a race condition if the last subscriber unsubscribes
//immediately after the null check and before the event is raise
if(RaiseCustomEvent !=null )
{
e.Message = String.Format(" at {0}", DateTime.Now.ToString());
RaiseCustomEvent(this, e);
}
}
} //Class that subscribes to an event
class Subscriber
{
private string id;
public Subscriber (string ID,Publisher pub)
{
id = ID;
//Subscribe to the event suing C# 2.0 syntax
pub.RaiseCustomEvent += HandleCustomEvent;
} //Define what action to take when the event is raised
void HandleCustomEvent(object sender,CustomEventArgs e)
{
Console.WriteLine(id + " receive this message: {0}", e.Message);
}
}
}
.Net Framework中的标准委托和事件_1的更多相关文章
- C语言函数指针与 c#委托和事件对比
C语言: 函数指针可以节省部分代码量,写类似具有多态的函数,比如要比较最大值,如果不用函数指针就只能写比较某一类型比如int类型的max函数,这个max无法比较string的大小.函数指针的意义就不多 ...
- C#学习之委托和事件
C#学习中,关于委托和事件的一些见解: 一.C语言中的函数指针 想要理解什么是委托,就要先理解函数指针的概念.所谓函数指针,就是指向函数的指针(等于没说-.-).比如我定义了两个函数square和cu ...
- c#中委托和事件(续)(转)
本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为 ...
- 转载:C#中委托、事件与Observer设计模式
原文地址 http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 感谢博主分享! 范例说明 假设 ...
- C#中委托和事件
目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...
- c#中委托和事件(转)
C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...
- C#中委托、事件和回调函数的理解
在C#中我们经常会碰到事件,尤其是在WPF或者WinForm中,窗体加载.或者点击一个按钮,都会触发事件.实际上,事件是对委托的封装.如果不进行封装,让委托暴露给调用者,调用者就可以把委托变量重新引用 ...
- 关于c#中委托与事件的一些理解
文章目的:作者(初学者)在学习c#的过程中,对事件.委托及其中的“object sender,EventArgs e”一直感觉理解不透,因此在网上找了一些资料,学习并整理出了该篇笔记,希望能将自己的心 ...
- 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码
详解C#泛型(二) 一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...
随机推荐
- 将Microsoft Ajax Minifier集成到VS2013对JS、CSS进行编译时压缩
在网站发布中,一般要将js,css文件压缩减少体积,以减少在HTTP请求中的流量.将Microsoft Ajax Minifier集成到VS2013中就可以对JS.CSS进行编译时压缩. VS2013 ...
- Feuding Families and Former Friends: Unsupervised Learning for Dynamic Fictional Relationships-Naacl 2016-20160422
1.Information publication:-Naacl 2016 2.What 根据小说中的人物描述,a)在每个时间段给出,人物关系的描述的概率分布,b)从时间轴上看出关系的变化轨迹,提出模 ...
- android之广播(一)
Android中的广播 系统在运行过程中会产生很多事件,某些事件产生的时候,比如:电量的改变,收发短信.拨打电话.屏幕解锁.开机等等,系统会发送广播.只要应用程序接受到这条广播就知道系统发生了相应的事 ...
- 网页设计:Meta标签详解
很多人忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性,有兴趣吗,谁我来重新认识一下META标签吧! META标签是HTML语言HEAD区的一个辅 ...
- [转]jQuery EasyUI自定义DataGrid的Editor
原文地址:http://www.jeasyuicn.com/post-3.html 官网datagrid的api:http://jquery-easyui.wikidot.com/document:d ...
- Java 测试代码模板
package com.robert.service; import org.apache.commons.logging.Log; import org.apache.commons.logging ...
- java中是否会存在内存泄漏
会.java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中 ...
- bash中不可以用字符串做数组下标
bash中可以用字符串做数组下标吗例如 test["abc"]=1------解决方案-------------------- 好像是误会,是awk里可以,bash shell里不 ...
- Hibernate 执行原始SQL语句
在hibernate中有时不需要用到表的映射,需要直接执行SQL语句. 其中sessionFactory在配置文件中配置,SSH详细配置见http://blog.csdn.NET/xumengxing ...
- ubuntu安装eclipse tomcat的参考网址
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined解决 - Linux操作系统:Ubuntu_Centos_D ...