利用委托自定义事件

事件,这个大家都非常熟悉的名词,代码里几乎离不开它。但是我们平时都是用现成的事件,如果满足不了我们的需求怎么办?那就只能咱自己写了,那么问题就来了,如何自定义事件呢?

在这之前,我们就必须先了解事件与委托的干系是什么,只有弄清楚事物的本质,我们才能掌握住事物的灵魂。

我们先看看最常用的一个事件:Form_Load()

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

MessageBox.Show("窗体加载了");

}

这个事件平时是自动发生的,那么我们现在来手动发生这个事件,来研究一下事件的底层。

public Form1()

{

InitializeComponent();

this.Load += new EventHandler(form_load);

}

public void form_load(object sender, EventArgs e)

{

MessageBox.Show("窗体加载了");

}

this.Load其实.net还是为你自动封装了,那么我们进一步手动发生这个事件。

public event EventHandler load;

public Form1()

{

InitializeComponent();

load += new EventHandler(form_load);

load(this,new EventArgs());

}

public void form_load(object sender, EventArgs e)

{

MessageBox.Show("窗体加载了");

}

那么到这里是不是就完了呢?不知道有没有人问,form_load的方法还是很像Form1_Load,那个要是自己定义的话,那才叫完全的手动实现呢。那么我们接着往下看:

private delegate void FormLoadEvent(string msg);

private event FormLoadEvent load;

public Form1()

{

InitializeComponent();

load += new FormLoadEvent(form_load);

load("窗体加载了");

}

public void form_load(string msg)

{

MessageBox.Show(msg);

}

这下终于明白事件的本质了吧,事件是委托的最终表现形式,也就是说事件就是委托的一种高级用法,事件就是利用委托实现的。

但是事件和委托还有一定区别,委托是一个类,而事件是依赖于类的,所以委托可以声明在类的外面,而事件必须写在类的里面。

事件必须建立在委托的基础上才能得以实现,即先声明委托再定义事件,所以格式一般比较固定,例如:

private delegate void FormLoadEvent(string msg);

private event FormLoadEvent load;

由于事件是可连续触发的,所以对于事件的赋值要采用“+=”和“-=”运算,“+=”代表累积事件,“-=”代表移除某一事件,例如:

load += new FormLoadEvent(form_load);

在实例化委托【new FormLoadEvent】时把form_load当做参数写入。这样就将事件与自己写的方法进行了关联。

这里就为大家介绍了利用委托自定义事件的基础了,只要理解到位,日后熟能生巧,再遇上复杂的事件代码相信也会迎刃而解!但要想很好的掌握自定义事件,就必须先学好委托,关于委托的介绍,可以参见我的博文“委托(Delegate)简介”。

时间: 2024-10-12 19:59:05

利用委托自定义事件的相关文章

C#委托五(自定义事件)

事件: "在发生其他类或对象关注的事情时,类或对象可以通过事件通知他们.发送(或引发)事件的类称为"发行者",接受(或处理)事件的类称为"订户"." 上面这句话描述了事件的最本质功能,用于底层通知上层.正常的架构设计都是分层结构,而分层结构有一点很重要的就是底层对于上层的无知,当初这样设计是为了解耦,为了更好的面向对象,但是带来的问题是如何解决自下而上的信息流.因为自上而下的调用,我们通过接口就可以搞定一切了,上层可以看到下层提供的服务接口,那么

[02]WPF异步响应,自定义事件、委托——多线程处理

题记 在编写有GUI的程序时,会遇到这样一种情形:用户点击了一个按钮,程序处理这个事件,然而这个处理过程耗时间较长.我们不想让软件卡在这里,而是让用户可以继续使用其他的软件功能.这种问题可以用多线程的事件响应来解决.这里,我就WPF的多线程事件响应做一个简单的归纳. 一.简单的异步的事件响应 在WPF中,针对简单的多线程处理过程,我们可以使用.NET自带的BackgroundWork完成.BackgroundWork的处理过程就是异步的,不会让用户界面停止响应. using System.Com

[转载]C#深入分析委托与事件

原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 引言 本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Deleg

[转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委托是一个类型,是一个函数指针类型,这个类型将该委托的实例化对象所能指向的函数的细节封装起来了,即规定了所能指向的函数的签名,也就是限制了所能指向的函数的参数和返回值.当实例化委托的时候,委托对象会指向某一个匹配的函数,实质就是将函数的地址赋值给了该委托的对象,然后就可以通过该委托对象来调用所指向的函

C#综合揭秘——深入分析委托与事件

本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单.在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用.最后一节,将介绍Predicate<T>.Action<T>.Func<T,TResult>多种泛型委托的使用和Lamb

.NET基础拾遗(4)委托、事件、反射与特性

Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 一.委托基础 1.1 简述委托的基本原理 委托这个概念对C++程序员来说并不陌生,因为它和C++中的函数指针非常类似,很多码农也喜欢称委托为安全的函数指针.无论这一说法是否正确,委托的的确确实现了和函数指针类似的功能,那就是提供了程序回调指定方法的机制. 在委托内部,包含了一个指向某个方法的指针(这一点上委托实现机制和C++的函数指针一致),为何称其

jQuery基础(鼠标事件,表单事件,键盘事件,自定义事件 篇)

1.jQuery鼠标事件之click与dbclick事件 方法一:$ele.click()(不带参数) <div id="test">点击触发<div> $("ele").click(function(){ alert('触发指定事件') }) $("#test").click(function(){ $("ele").click() //手动指定触发事件 });   方法二:$ele.click( h

委托和事件 (2) - 事件

事件的由来 上文说到委托的安全性不佳,于是我们要将委托本身私有化,但还要暴露若干方法让外界使用.其中最重要的必然就是为委托挂接方法和调用委托,以便间接地调用委托所代表方法.那么事件event关键字就是c#提供给我们的一个语法糖.他并没有任何新的东西,只是减少了一些代码.所以,事件是一种特殊的委托,其特征有: 1 和一个(基底)委托类型合作,当声明了一个具有该基底委托类型的事件之后,用户在外部就可以为这个事件挂接方法,其方法类型必须和基底委托类型相同 2 可以将事件视为委托的方法链,使用event

重中之重:委托与事件

相关文章链接 编程之基础:数据类型(一) 编程之基础:数据类型(二) 高屋建瓴:梳理编程约定 动力之源:代码中的泵 难免的尴尬:代码依赖 可复用代码:组件的来龙去脉 物以类聚:对象也有生命 重中之重:委托与事件 5.1 什么是.NET中的委托 5.1.1 委托的结构 5.1.2 委托链表 5.1.3 委托的不可改变特性 5.1.4 委托的作用 5.2 事件与委托的关系 5.3 使用事件编程 5.3.1 注销跟注册事件同样重要 5.3.2 多线程中使用事件 5.3.3 委托链表的分步调用 5.3.