Visual C#2005中的匿名委托的实现
委托技术是.NET引入的一种重要技术,使用委托可以实现对象行为的动态绑定,从而提高设计的灵活性。
首先,delegate中可以注册任意多个回调,在一个delegate被调用的时候,已经注册的过程将会被逐个调用。
其次,delegate允许注册一个对象的方法,而不像C++中指可以使用静态方法或者全局方法作为函数指针,提供了更多的灵活性,同时也暗示我们,delegate中按照某种方式保存了object的很多信息。
下面看看委托在C#1.1中的实现:
public delegate void thisDelegate(int a);
public void Eample1()
{
thisDelegate testdel1 = new thisDelegate(outInt);
testdel1(12);
}
public void outInt(int x)
{
Console.WriteLine("output x : {0}", x);
}
在C#2.0的匿名delegate中,我们甚至可以访问当前匿名委托的上下文变量。上面的例子在C#2.0中可以这么写:
public void Eample1()
{
thisDelegate testdel1 = outInt;
testdel1(12);
}
或者这么写也可以:
delegate void thisDelegate2(int a);
public void Eample2()
{
int a = 12;
thisDelegate ev2 = delegate(ref int x)
{ Console.WriteLine("output x : {0}", x); };
ev2( ref a);
}
在C#1.1中,委托对于局部变量是没有除参数外的访问方式的,而在2.0中已经可以实现了,我们在看下面的例子:
public static void Eample3()
{
int a = 12;
int y = 32;
thisDeliete ev2 = delegate(ref int x)
{ Console.WriteLine("output x + y : {0}", x + y); };
ev2( ref a);
}
在这个例子中,匿名函数中的内容x + y的值被正确的输出了,这样做有什么意义呢?实际上使用匿名委托最大的好处在于可以完整地克隆当前运行空间上下文的可用变量,我觉着这就是他的意义所在。