委托(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# 委托、事件的更多相关文章

  1. C# ~ 从 委托事件 到 观察者模式 - Observer

    委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ...

  2. C#委托,事件理解入门 (译稿)

    原文地址:http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified 引用翻译地址:http://www.cnbl ...

  3. 关于ios使用jquery的on,委托事件失效

    $('.parents').on("click",'.child',function(){}); 类似上面这种,在ios上点击"child"元素不会起作用,解决 ...

  4. Observer设计模式中-委托事件-应用在消息在窗体上显示

    Observer设计模式:监视者模式.在类中的方法中处理的结果或者消息通过事件委托 的方式发送给主窗体. 因为在其它类中直接访问主窗体类,显示内容是不能直接调用控件赋值的,当然也有别的类似查阅控件名, ...

  5. Asp.net用户控件和委托事件

    在Asp.net系统制作过程中,门户类型的网站,我们可以用DIV+CSS+JS+Ajax全部搞定,但是一旦遇到界面元素比较复杂的时候,还是UserControl比较方便一些,各种封装,各种处理,然后拖 ...

  6. jQuery里面的普通绑定事件和on委托事件

    以click事件为例: 普通绑定事件:$('.btn1').click(function(){}绑定 on绑定事件:$(document).on('click','.btn2',function(){ ...

  7. c#基础学习笔记-----------委托事件

    这里有一个比较简单的委托实例应用(跨窗体操作控件) http://blog.csdn.net/bdstjk/article/details/7004035 还有一个比较详细的介绍并深入理解委托事件的讲 ...

  8. c#委托事件入门--第二讲:事件入门

    上文 c#委托事件入门--第一讲:委托入门 中和大家介绍了委托,学习委托必不可少的就要说下事件.以下思明仍然从事件是什么.为什么用事件.怎么实现事件和总结介绍一下事件 1.事件是什么:. 1.1 NE ...

  9. Unity C#笔记 委托&事件

    C#的委托与事件搭配,即是观察者模式的一种实现. 因为观察者模式的原理很易懂,不作多讲,本文纯粹用于记录语法. delegate(委托) //声明没有参数,没有返回值的委托类型XXXX public ...

  10. JavaScript中事件委托(事件代理)详解

    在JavaScript的事件中,存在事件委托(事件代理),那么什么是事件委托呢? 事件委托在生活中的例子: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托 ...

随机推荐

  1. JAVA中浅复制与深复制

    1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复 ...

  2. jQuery默认select选择第一个元素

    $("#id option:first").prop("selected", 'selected');

  3. 整理Crontab 定时计划

    一. 什么是crontab? crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和 ...

  4. UVA489 - Hangman Judge【紫书例题4.2】

    题意:就是给出一个字符串,让你去一个一个猜测,相同字母算一次,如果是之前猜过的也算错,如果你在错7次前猜对就算你赢,文章中是LRJ的例题代码. #include<stdio.h> #inc ...

  5. jenkins+svn+tomcat部署war包

    svn是版本控制器,是提供一个版本库让程序员把项目提交上去,每一次更新代码提交后都会记录 jenkins是持续部署的工具,是让项目自动部署发布出去的工具,当项目代码发生改变时就需要重新打包成war包, ...

  6. 突如其来的“中断异常”,我(Java)该如何处理?

    3.try-catch块 try语句块中代码执行时发生三种情况: try语句块中代码正常执行完毕,没有任何异常,那么catch语句块的代码将不会被执行. import java.util.*; pub ...

  7. 用windows远程桌面连接ubuntu

    从Windows 7远程到Windows系统比较简单,只要对方电脑开启远程桌面功能就可以了,但Windows 7远程桌面连接到Ubuntu 14.04比较复杂一点,具体操作步骤如下. Ubuntu 1 ...

  8. lucene_07_solr使用IK分词器

    使用IKAnalyzer 中文分析器.. 第一步: 把,IKAnalyzer2012FF_u1j 添加到sol/WEB-INF/lib 目录下. 第二步: 复制IKAnalyzer 的配置文件和自定义 ...

  9. PHP5.5下安装配置EcShop

    建议用较旧的PHP版本与EcShop搭配,比如PHP5.3,新版的PHP有很多奇奇怪怪的问题... 错误描述: Deprecated: preg_replace(): The /e modifier ...

  10. 洛谷 P2712 摄像头

    题目描述 食品店里有n个摄像头,这种摄像头很笨拙,只能拍摄到固定位置.现有一群胆大妄为的松鼠想要抢劫食品店,为了不让摄像头拍下他们犯罪的证据,他们抢劫前的第一件事就是砸毁这些摄像头. 为了便于砸毁摄像 ...