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) (转)的更多相关文章
- 重温委托(delegate)和事件(event)
1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...
- 关于C# 委托(delegate)与事件(event)的用法及事例
C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用.有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床. ...
- 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)放到现在讲是有目的的:给下次写 ...
- 【温故知新】c#事件event
从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- C# Note2:委托(delegate) & Lambda表达式 & 事件(event)
前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...
- 【Unity|C#】基础篇(8)——委托(Delegate)/ 事件(Event)
[学习资料] <C#图解教程>(第13~14章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.bai ...
- C#:代表(delegate)和事件(event)
代表(delegate): 它是C#语言里面的函数指针,代表可以指向某一个函数,在运行的时候调用这个函数的实现.下面来看看它的实现步骤: 声明一个delegate对象. 实现和delegate具有相同 ...
随机推荐
- dpkg和perl的依赖环境出现错误故障解决(磁盘原因)
内核: uname -a Linux localhost.localdomain 3.4.29-t4 #12 Wed Mar 13 16:50:15 EST 2013 armv7l armv7l ar ...
- 花了一年时间完成的 在线G代码编辑,加工系统 G-Code Editor V1.0
G代码是数控程序中的加工指令.一般都称为G指令.可以直接用来驱动机床,各种控制系统.是一种数控行业标准.传统的G代码编写以及编辑无法在线编辑,也不能实时看到g代码编辑的最后加工路径已经不能直接对编辑的 ...
- 利用python发送邮件
找了很多使用python发送邮件的文章, 发现写的并不是太全, 导致坑特别多, 刚把这个坑跨过去, 在此记录下来 本代码使用163作为发送客户端, 接收邮箱随意 首先登录163邮箱, 开启POP3/S ...
- 教你用python写:HDU刷题神器
声明:本文以学习为目的,请不要影响他人正常判题 HDU刷题神器,早已被前辈们做出来了,不过没有见过用python写的.大一的时候见识了学长写这个,当时还是一脸懵逼,只知道这玩意儿好屌-.时隔一年,决定 ...
- NYOJ--113--字符串替换
/* Name: NYOJ--113--字符串替换 Author: shen_渊 Date: 18/04/17 15:41 Description: 字符串水题,秒过 */ #include<b ...
- DynamicJSONserializer
https://github.com/ststeiger/DynamicJSONserializer/blob/master/DynamicJSONserializer/Program.cs name ...
- CSDN社区投诉申请表
最近两天我发现我的个人网站,业余草:www.xttblog.com,流量急速下滑.经过分析,发现是被CSDN社区的一个博客网友将我网站上的内容搬到了他的CSDN博客上.导致了已搜索就全部导流到了CSD ...
- RabbitMQ安装以及java使用(一)
最近闲来无事,整理下基础知识,本次安装 1.RabbitMQ版本是3.6.10 2.操作系统是centOS 7 64位 虚拟机IP:192.168.149.133 1.安装更新系统环境依赖 yum ...
- vue2.0 新手教程
想想自己写vue的项目也写了一年了,从vue1.0到2.0,走过不少路,填过不少坑, 下面记录一下新手从0到1的过程,本文“应该”会持续更新 首先安装vue的运行环境node 1.下载Nodejs并安 ...
- [算法题] Search in Rotated Sorted Array ii
题目内容 题目来源:LeetCode Suppose an array sorted in ascending order is rotated at some pivot unknown to yo ...