zhouqijie

委托(delegate)

CRE:委托是用户定义的一个类,定义一个委托即定义一个类。
CRE:委托是对方法的引用,类似C++函数指针。

在C++中,函数指针不过是一个指向内存位置的指针,它不是类型安全的。而.NET委托就完全不同,委托是类型安全的类,它定义了返回类型和参数类型。委托还可以包含对多个方法的引用。

应用场景

有时候需要把一个方法/函数传递给另一个方法/函数。例如启动线程任务、事件处理等。

在面向对象编程中,方法几乎都要与类实例相关联,所以函数指针这种机制不能使用,需要把方法的细节封装在一种新的对象类型中,即委托。

定义

委托定义:
public delegate TR MyDel(T1, T2...)

委托变量的实例化:
MyDel del = new MyDel(method1)(旧语法)(参数和返回值类型必须匹配)
MyDel del = method1(C#2.0)

多播

CRE:C#委托都是多播委托。

?:委托是不可变的,使用+=、-=操作符是实际上创建了新的委托来赋给当前委托变量。

方法的组合、新增、删除:
del = del1 + del2
del += del1
del -= del1

匿名方法

普通匿名方法:Mydel del = delegate (T1, T2){...}
Lambda表达式:Mydel del = (T1, T2)=>{...}

常用委托Action<>和Func<>

Action<>委托返回void类型,Func<>委托返回指定类型的值。

?:实际上仅通过两种泛型委托就可以满足99% 的需求。





(END)