C# 委托、事件
委托(delegate)
访问修饰符 delegate 返回值类型 委托名 (参数列表)
委托是一种可以把引用存储为函数的类型,也就是说它声明了一种用于保存特定格式函数的数据类型,如图C++中的函数指针。
1.匿名委托
委托类型 实例化名 = delegate(参数列表){函数体}
2.泛型委托
delegate T1 委托名<T1, T2>(T1 v1, T2 v2);
3.委托的多播性
委托类型 实例化名 += 注册函数
委托类型 实例化名 -= 解除函数
一个实例化委托不仅可以注册一个函数还可以注册多个函数,注册多个函数后,在执行委托的时候会根据注册函数的注册先后顺序依次执行每一个注册函数。
如果委托是有返回值的,则返回的是最后一个函数的返回值。
注意:如果对已经注册了函数的委托实例从新使用=号赋值,相当于从新实例化。
事件
访问修饰符 event 委托类型 事件名
事件类似于异常,因为它们都是由对象引发,我们可以提供代码来处理事件。单个事件可供多个处理程序订阅,在该程序发生时,这些处理程序都会被调用。
事件注册和解除函数操作与委托一样。其实事件就是对委托的封装,就如同c#类中属性对字段的封装一样,其封装后可以在委托上封装更复杂的逻辑。在事件被编译后自动生成了个private的委托实例和两个函数add_checkEvent和remove_checkEvent,这两个函数分别对应事件的+=/-=操作
1.隐式声明事件
event 委托类型 事件名
2.显示声明事件
event 委托类型 事件名
{
add
{
//将函数注册到自己定义的委托实例
}
remove
{
//解除函数对自己定义的委托实例的注册
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 事件
{
class delegateTest
{
public delegate bool Comparer(int v1, int v2);
public Comparer Compare; public bool Max(int v1, int v2) { return v1 > v2; }
public bool Min(int v1, int v2) { return v1 < v2; } /// <summary>
/// 匿名委托
/// </summary>
private Comparer myCompare = delegate(int v1, int v2)
{
return v1 == v2;
}; /// <summary>
/// 泛型委托
/// </summary>
public delegate T2 _Com<T1, T2>(T1 v1, T1 v2); public void sort(int[] arr, Comparer com)
{
for (int i = ; i < arr.GetLength(); i++)
{
for (int j = ; j < arr.GetLength() - i - ; j++)
{
if (!com(arr[j], arr[j + ]))
{
int iTemp = arr[j];
arr[j] = arr[j + ];
arr[j + ] = iTemp;
}
}
}
}
}
}
客户端代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers; namespace 事件
{
class Program
{
public static event delegateTest.Comparer eventComparer;
static void Main(string[] args)
{
int[] arr = new int[] { , , , , , , }; delegateTest test = new delegateTest();
test.sort(arr, test.Max);
foreach (int v in arr)
{
Console.Write("{0} ", v);
} ///////////////////////////////////////////////
Console.WriteLine();
test.Compare = hello;
test.Compare += world;
//注册了多个函数的委托,返回值为最后运行的函数的返回值。
Console.WriteLine(test.Compare(, )); //泛型委托实例化
delegateTest._Com<int, bool> compare = test.Max; ///////////////////////////////////////////////
eventComparer = hello;
eventComparer += world;
eventComparer(, );
} static bool hello(int v1, int v2)
{
Console.Write("hello ");
return false;
}
static bool world(int v1, int v2)
{
Console.WriteLine("wrold!");
return true;
}
}
}
C# 委托、事件的更多相关文章
- C# ~ 从 委托事件 到 观察者模式 - Observer
委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ...
- C#委托,事件理解入门 (译稿)
原文地址:http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified 引用翻译地址:http://www.cnbl ...
- 关于ios使用jquery的on,委托事件失效
$('.parents').on("click",'.child',function(){}); 类似上面这种,在ios上点击"child"元素不会起作用,解决 ...
- Observer设计模式中-委托事件-应用在消息在窗体上显示
Observer设计模式:监视者模式.在类中的方法中处理的结果或者消息通过事件委托 的方式发送给主窗体. 因为在其它类中直接访问主窗体类,显示内容是不能直接调用控件赋值的,当然也有别的类似查阅控件名, ...
- Asp.net用户控件和委托事件
在Asp.net系统制作过程中,门户类型的网站,我们可以用DIV+CSS+JS+Ajax全部搞定,但是一旦遇到界面元素比较复杂的时候,还是UserControl比较方便一些,各种封装,各种处理,然后拖 ...
- jQuery里面的普通绑定事件和on委托事件
以click事件为例: 普通绑定事件:$('.btn1').click(function(){}绑定 on绑定事件:$(document).on('click','.btn2',function(){ ...
- c#基础学习笔记-----------委托事件
这里有一个比较简单的委托实例应用(跨窗体操作控件) http://blog.csdn.net/bdstjk/article/details/7004035 还有一个比较详细的介绍并深入理解委托事件的讲 ...
- c#委托事件入门--第二讲:事件入门
上文 c#委托事件入门--第一讲:委托入门 中和大家介绍了委托,学习委托必不可少的就要说下事件.以下思明仍然从事件是什么.为什么用事件.怎么实现事件和总结介绍一下事件 1.事件是什么:. 1.1 NE ...
- Unity C#笔记 委托&事件
C#的委托与事件搭配,即是观察者模式的一种实现. 因为观察者模式的原理很易懂,不作多讲,本文纯粹用于记录语法. delegate(委托) //声明没有参数,没有返回值的委托类型XXXX public ...
- JavaScript中事件委托(事件代理)详解
在JavaScript的事件中,存在事件委托(事件代理),那么什么是事件委托呢? 事件委托在生活中的例子: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托 ...
随机推荐
- (转)Openlayers 2.X加载高德地图
http://blog.csdn.net/gisshixisheng/article/details/44853881 概述: 前面的有篇文章介绍了Openlayers 2.X下加载天地图,本节介绍O ...
- Webpack 快速上手(下)
杏仁前端开发工程师,代码洁癖症早期,关注前端技术. 由于文章篇幅较长,为了更好的阅读体验,本文分为上.中.下三篇: 上篇介绍了什么是 webpack,为什么需要 webpack,webpack 的文件 ...
- Day7 字符串和常用数据结构
字符串和常用数据结构 使用字符串 第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处理的信息主要是数值,而世界上的第一台 ...
- [poj3565] Ants (二分图带权匹配)
传送门 Description 年轻自然主义者比尔在学校研究蚂蚁. 他的蚂蚁以苹果树上苹果为食. 每个蚁群都需要自己的苹果树来养活自己. 比尔有一张坐标为 n 个蚁群和 n 棵苹果树的地图. 他知道蚂 ...
- svg文件报错
错误:The content of element type "font-face" is incomplete, it must match "((font-face- ...
- VmWare安装centos7无法上网
1.关闭防火墙 systemctl stop firewalld.service #关闭 systemctl restart firewalld.service #重启 2.虚拟机->设置-&g ...
- java链接linux服务器,命令操作
1.本地读取linux文件,即在Windows上链接外部linux package com.common.utils; import java.io.BufferedReader; import ja ...
- python爬虫09 | 上来,自己动 !这就是 selenium 的牛逼之处
作为一个男人 在最高光的时刻 就是说出那句 之后 还不会被人打 ... 虽然在现实生活中你无法这样 但是在这里 就让你体验一番 那种呼风唤雨的感觉 我们之前在爬取某些网站的时候 使用到了一些 pyth ...
- 《奋斗吧!菜鸟》 第八次作业:Alpha冲刺 Scrum meeting 4
项目 内容 这个作业属于哪个课程 任课教师链接 作业要求 https://www.cnblogs.com/nwnu-daizh/p/11012922.html 团队名称 奋斗吧!菜鸟 作业学习目标 A ...
- uva 11624
#include<stdio.h> #include<string.h> #include<queue> using namespace std; #define ...