委托(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;
}
}
}

最新文章

  1. 背压(Backpressure)机制
  2. Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
  3. 解决织梦channel标签 指定typeid或设置son时 currentstyle无效的修复办法
  4. 腾讯优测-优社区干货精选 | android开发在路上:少去踩坑,多走捷径(下)
  5. Python TF-IDF计算100份文档关键词权重
  6. ps做gif love教程(转)
  7. HashMap Hashtable ArrayList HashSet
  8. POJ - 3061 Subsequence(连续子序列和&gt;=s的最短子序列长度)
  9. 使用 win10 的正确姿势 (第二版)
  10. ●BZOJ 4698 Sdoi2008 Sandy的卡片
  11. Java实现简易的文本编辑器
  12. &lt;知识整理&gt;2019清北学堂提高储备D1
  13. February 15th, 2018 Week 7th Thursday
  14. .net 上传文件大小限制
  15. GDOI2018D2T1 谈笑风生
  16. 常用RAID级别的介绍
  17. Alpha阶段项目复审(小小大佬带飞队)
  18. ios虚拟机安装(二)
  19. http://www.cnblogs.com/txw1958/p/alipay-f2fpay.html
  20. Android Studio --&gt; Gradle Build设置自动

热门文章

  1. [Intermediate Algorithm] - Drop it
  2. 获取url后面的路径
  3. Javascript语法,变量类型,条件,循环语句,函数,面向对象
  4. 神奇的splay树
  5. 08.Web服务器-4.Web服务器动态资源请求
  6. python爬虫03:那个叫做 Urllib 的库让我们的 python 假装是浏览器
  7. 单元测试代码:SpringTest+JUnit
  8. MongoDB简介、特点、原理、使用场景、应用案例
  9. Vue.js教程—1.介绍和安装
  10. Spring Boot-整合redis(六)