委托
delegate是一种可用于封装命名方法或匿名方法的引用类型。委托类似于C++中的函数指针;但是委托是类型安全和可靠的。
委托类型的声明与方法签名相似,它有一个返回值和任意数目任意类型的参数。
委托的声明原型:
delegate <函数返回类型> <委托名> (<函数参数>)
例:
public delegate void TestDelegate(string message);
public delegate int TestDelegate(MyType m,long num);
委托是事件的基础。
通过将委托与命名方法或匿名方法关联,可以实例化委托。
必须使用具有兼容返回类型和输入参数的方法或lambda表达式实例化委托。
为了与匿名方法一起使用,委托和与之关联的代码必须一起声明。
示例:
// Declare delegate -- defines required signature:
delegate double MathAction(double num);
class DelegateTest
{
// Regular method that matches signature:
static double Double(double input)
{
return input * 2;
}
static void Main()
{
// Instantiate delegate with named method:
MathAction ma = Double;
// Invoke delegate ma:
double multByTwo = ma(4.5);
Console.WriteLine("multByTwo: {0}", multByTwo);
// Instantiate delegate with anonymous method:
MathAction ma2 = delegate(double input)
{
return input * input;
};
double square = ma2(5);
Console.WriteLine("square: {0}", square);
// Instantiate delegate with lambda expression
MathAction ma3 = s => s * s * s;
double cube = ma3(4.375);
Console.WriteLine("cube: {0}", cube);
}
// Output:
// multByTwo: 9
// square: 25
// cube: 83.740234375
}
事件
事件是一种特殊的委托,其实事件就是对委托的封装。
隐式事件声明:
event <委托类型> 事件名
例:
public event CheckDelegate checkEvent;
反射机制中:
可以看到在事件被编译后自动生成了个private的委托实例checkEvent和两个函数add_checkEvent和remove_checkEvent,这两个函数分别对应事件的+=/-=操作,另外可以看到在声明了事件后的确是产生了一个和事件同名私有的委托实例checkEvent,对事件的+=/-=操作都会反映在这个同名委托实例checkEvent上,所以可以在定义事件的类里面直接调用checkEvent()来执行注册函数和对checkEvent使用=号重新赋值,实际上这里操作的并不是checkEvent事件,而操作的是同名委托实例checkEvent,因此隐式声明的事件,其实就是由一个委托实例和两个函数封装而成,所有的操作最终都反映在委托实例上。
显式事件声明:
event <委托类型> 事件名
{
add
{
//将函数注册到自己定义的委托实例
}
remove
{
//解除函数对自己定义的委托实例的注册
}
}
显示声明事件就是要自己手动实现隐式声明中的一个委托实例和两个函数。
例:
private CheckDelegate _checkDelete;
public event CheckDelegate checkEvent
{
add
{
_checkDelete = Delegate.Combine(_checkDelete, value) as CheckDelegate;
}
remove
{
_checkDelete = Delegate.Remove(_checkDelete, value) as CheckDelegate;
}
}
反射机制中:
网友评论