一直以来都是对于事件与委托比较混淆,而且不太会用。找了个时间,总结了一下,感觉清晰了很多。
先说一下个人理解的结论吧:
delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。
delegate声明的变量与delegate声明的事件,并没有本质的区别,事件是在delegate声明变量的基础上包装而成的,类似于变量与属性的关系(在IL代码中可以看到每一个delegate声明的事件都对应是私有的delegate声明的变量),提升了安全性。
Action 与Func:这两个其实说白了就是系统定义好的Delegate,他有很多重载的方法,便于各种应用情况下的调用。他在系统的System命名空间下,因此全局可见。
首先了解一下, ILDasm中图标含义:
该图来自:http://www.cnblogs.com/zery/p/3366175.html
委托创建步骤:
1、用delegate关键字创建一个委托,包括声明返回值和参数类型
2、使用的地方接收这个委托
3、创建这个委托的实例并指定一个返回值和参数类型匹配的方法传递过去
一、事件与委托
新建一个事件委托测试项目:EventDelegateTest
具体代码如下:
- <span style="font-size:14px;"><span style="font-size:14px;">namespace EventDelegateTest
- {
- public class TestClass
- {
- public delegate int delegateAction();
- public event delegateAction OnActionEvent;
- public delegateAction daNew;
- }
- }</span></span>
编译代码后,使用 Visual Studio 2010自带的ILDASM.EXE:
public Action<bool,bool> ac;
上面这个声明就是:
该方法具有两个参数并且不返回值的委托。
从微软公布的源码中,可以看到,如下实现:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
-
- namespace IconTest
- {
- public partial class Form2 : Form
- {
- Predicate<int> myPredicate;
- int[] myNum = new int[8] { 12, 33, 89, 21, 15, 29, 40, 52 };
- public int[] myResult;
- public Form2()
- {
- InitializeComponent();
- myPredicate = delegate(int curNum)
- {
- if (curNum % 2 == 0)
- {
- return true;
- }
- else
- {
- return false;
- }
- };
- }
- private void Form2_Load(object sender, EventArgs e)
- {
- myResult = Array.FindAll(myNum, myPredicate);
- }
- }
- }
上例中说明了Predicate的使用,FindAll方法中,参数2即是一个Predicate,在具体的执行中,每一个数组的元素都会执行指定的方法,如果满足要求返回true,并会被存放在结果集中,不符合的则被剔除,最终返回的集合,即是结果判断后想要的集合。Array.FindAll 泛型方法:点击打开链接
Delegate 类:点击打开链接
作者:jiankunking 出处:http://blog.csdn.net/jiankunking
个人微信公众号: