C#:代表(delegate)和事件(event)
代表(delegate):
它是C#语言里面的函数指针,代表可以指向某一个函数,在运行的时候调用这个函数的实现。下面来看看它的实现步骤:
- 声明一个delegate对象。
- 实现和delegate具有相同参数和返回值的函数实现(可以是静态和非静态的)。
- 产生一个delegate对象的时候,把你刚刚实现的函数作为参数传给他的构造函数。
请看下面例子:
using System;
using System.Collections.Generic;
using System.Text;
namespace UsingDelegate
{
public delegate void MyDelegate(string mydelegate);//声明一个delegate对象
public class TestClass
{
//实现有相同参数和返回值的函数
public void HelloDelegate(string mydelegate)
{
Console.WriteLine(mydelegate);
}
//实现有相同参数和返回值的静态函数
public static void HelloStaticDelegate(string mystaticdelegate)
{
Console.WriteLine(mystaticdelegate);
}
}
class Program
{
static void Main(string[] args)
{
TestClass testClass = new TestClass();
MyDelegate mydelegate = new MyDelegate(testClass.HelloDelegate);//产生delegate对象
mydelegate("Hello delegate");//调用
MyDelegate myStaticDelegate = new MyDelegate(TestClass.HelloStaticDelegate);//产生delegate对象
myStaticDelegate("Hello static delegate");//调用
}
}
}
事件(event):
让我通过一个例子来模拟事件的整个过程:
- 创建一个button类,它里面有一个click 事件。
- 创建一个Form类,他里面有一个我们上面定义的button类。
- 要求:当我们用户单击button类的时候From类要对他进行处理,输出一条信息“我知道你被单击了”
请看下图:

首先我们会单击button,然后button会通知Form,然后From就作出相应。这个过程在C#里面应该怎么做到呢?
下面我会列出上述例子的源代码(这里就不介绍怎么声明event等等内容了):
using System;
using System.Collections.Generic;
using System.Text;
namespace UsingEvent
{
public delegate void ClickEventHandler(object sender, EventArgs e);//声明一个代表:请看文章最后面Note
public class MyButton //创建MyBottom
{
public event ClickEventHandler ClickEvent;//声明一个事件
public void Click() //单击MyButton
{
if (ClickEvent != null)
{
Console.WriteLine("MyButton: 我被单击了");
ClickEvent(this, null); //抛出事件,给所有相应者
}
}
}
public class MyForm
{
public MyButton myButton = new MyButton();
public MyForm()
{
//添加事件到myButton中,当myButton被单击的时候就会调用相应的处理函数
myButton.ClickEvent += new ClickEventHandler(OnClickEvent);
}
//事件处理函数
void OnClickEvent(object sender, EventArgs e)
{
Console.WriteLine("MyForm: 我知道你被单击了!");
}
}
class Program
{
static void Main(string[] args)
{
MyForm form = new MyForm();//生成一个MyForm
form.myButton.Click();//单击MyForm中的鼠标,效果就出来了
}
}
}
Note:public delegate void ClickEventHandler(object sender, EventArgs e);这是事件委托标准的声明方法,其实在参数里面我们可以不传,也可以是其他类型的。但是最好还是使用上面的声明方法,你可以继承EventArgs,来包装你要传送的其他任何参数。
C#:代表(delegate)和事件(event)的更多相关文章
- C#中的委托(Delegate)和事件(Event)
原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...
- (转)C#中的委托(Delegate)和事件(Event)
转自:http://blog.chinaunix.net/uid-576762-id-2733751.html 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...
- 重温委托(delegate)和事件(event)
1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...
- 关于C# 委托(delegate)与事件(event)的用法及事例
C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用.有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床. ...
- 【温故知新】c#事件event
从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...
- C#:委托(delegate)和事件(event) (转)
委托(delegate): 它是C#语言里面的函数指针,代表可以指向某一个函数,在运行的时候调用这个函数的实现.下面来看看它的实现步骤: 声明一个delegate对象. 实现和delegate具有相同 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- C# delegate和C# event
在基于Windows平台的程序设计中,事件(event)是一个很重要的概念.因为在几乎所有的Windows应用程序中,都会涉及大量的异步调用,比如响应点击按钮.处理Windows系统消息等,这些异步调 ...
- C#事件(event)解析
事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...
随机推荐
- unity3d web.config设置
原地址:http://www.cnblogs.com/88999660/archive/2013/03/22/2976105.html <?xml version="1.0" ...
- HDU 1176免费馅饼 DP数塔问题转化
L - 免费馅饼 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- python __init__ __call__
__call__ 和 __init__半毛钱的关系都没有. 后者是构造类的实例时会调用的方法,并不是构造方法. 前者是在实例上可以呼叫的方法.代码示例如下: >>> class fo ...
- excel中如何批量将所有的网址设为超链接
首先如果数据较少的话,只需要双击鼠标左键,回车,就会自动转换成超链接. 转自: http://zhidao.baidu.com/question/200363361.html?qbl=relate_q ...
- WebSite和WebApplication的区别
1. WebApplication(Web应用程序)和WebSite(网站)的区别:WebSite是为了兼容从ASP转过来的开发人员的习惯而存在的,用起来简单,例如:不需要创建命名控件.C#代码修改以 ...
- cas单点登录用户名为中文的解决办法
当用户名为中文时,登录后返回的用户名乱码.解决这个问题只需要在客户端的CAS Validation Filter中添加下配置就行了. <init-param> <param-name ...
- Java for LeetCode 040 Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- 【JAVA、C++】LeetCode 004 Median of Two Sorted Arrays
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- java\c程序的内存分配
JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该 ...
- 基于gitosis的Git云端服务器配置
(本文需要自己实践,由于时间关系,我仅仅是做了整理和快速的练习,至于笔记中的账号和ip域名都是我参考文章中的.如果读者有任何问题欢迎留言和发邮件到luoquantao@126.com) 硬件:云端阿里 ...