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的事件中,存在事件委托(事件代理),那么什么是事件委托呢? 事件委托在生活中的例子: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托 ...
随机推荐
- 通用功能类:改变WinForm窗体显示颜色
一.显示窗体调用方法 protected override void OnLoad(EventArgs e) { MDIClientSupport.SetBevel ...
- mac 上执行 rm -rf /
# 很可怕的指令,清空磁盘所有资料,千万不要用 sudo 尝试,吓的小心肝差掉跳出来 rm -rf / 无聊,想执行rm -rf /会怎样,想起没加sudo时对~/download执行提示权限不足,被 ...
- Python-logging模块的初级使用
这篇文章适合刚接触logging模块,想快速使用 并看到使用效果的童鞋.如果想全面的了解logging模块,请移步~ 直接上代码+注释 #1.导入模块logging import logging #2 ...
- BZOJ 4259: 残缺的字符串 FFT_多项式
Code: #include<bits/stdc++.h> #define maxn 1200000 using namespace std; void setIO(string s) { ...
- Django—链接MySQL
Djalgo基础配置方法 静态文件配置方法 1 所有的静态文件都放在 static 文件夹下,例如Bootstrap值类的第三方库,通常 static 文件下会创建 css image js 文件,用 ...
- 【Codeforces Round #519 by Botan Investments D】Mysterious Crime
[链接] 我是链接,点我呀:) [题意] 相当于问你这m个数组的任意长度公共子串的个数 [题解] 枚举第1个数组以i为起点的子串. 假设i..j是以i开头的子串能匹配的最长的长度. (这个j可以给2. ...
- VIM 使用 匹配替换命令配合表达式 实现 递增替换
:let n=100 | g/while/s/\d/\=n / | let n=n+1 before 10 void *thread_function_1(void *arg) { 11 int i; ...
- 洛谷—— P1041 传染病控制
https://www.luogu.org/problem/show?pid=1041 题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜 ...
- 基于ffmpeg和libvlc的视频剪辑、播放器
以前研究的时候,写过一个简单的基于VLC的视频播放器.后来因为各种项目,有时为了方便测试,等各种原因,陆续加了一些功能,现在集成了视频播放.视频加减速.视频剪切,视频合并(增加中)等功能在一起.有时候 ...
- POJ 1985
求一棵树内最远的两点,DFS,顺便记录以某节点为根内最远的两点的距离,返回最远点的距离.其实是DP. #include <cstdio> #include <iostream> ...