• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

C# 2.0 新特性探究之委托与匿名委托

发布: 2007-7-14 20:11 | 作者: 佚名    | 来源: 网络转载     | 查看: 19次 | 进入软件测试论坛讨论

领测软件测试网 C# 2.0 新特性探究之委托与匿名委托:   delegate经常被人用来与回调相比较,其实两者在某种程度上由很多共同点。不过delegate有很多更加强大的地方。

   首先,delegate中可以注册任意多个回调,在一个delegate被调用的时候,已经注册的过程将会被逐个调用。

   其次,delegate允许注册一个对象的方法,而不像C++中指可以使用静态方法或者全局方法作为函数指针,提供了更多的灵活性,同时也暗示我们,delegate中按照某种方式保存了object的很多信息。

   在C#2.0的匿名delegate中,我们甚至可以访问当前匿名委托的上下文变量。接下来的文章中我们将会通过实际的例子,来看看强大的delegate。

   首先,让我们看看在C#1.2中的一个典型的委托的写法。

public delegate void TheEvent(int a);
public void test()
{
  TheEvent testdel1 = new TheEvent(del1);
  testdel1(12);
}

public void del1(int x)
{
  Console.WriteLine("output x : {0}", x);
}

   现在我们可以写成这样:

public void test()
{
  TheEvent testdel1 = del1;
  testdel1(12);
}

   或者将程序改写为:

delegate void TheEvent2(int a);
public void test2()
{
  int a = 12;
  TheEvent ev2 = delegate(ref int x)
  { Console.WriteLine("output x : {0}", x); };
  ev2( ref a);
}

   比起1.2来,delegate的可读性更好,但是似乎没有本质的提高?慢着,让我们看看下面的例子。

public static void test3()
{
  int a = 12;
  int y = 32;
  TheEvent ev2 = delegate(ref int x)
  { Console.WriteLine("output x + y : {0}", x + y); };
  ev2( ref a);
}

   注意,匿名函数中的内容!x + y的值被正确的输出了,而在1.2中,委托对于局部变量是没有除参数外的访问方式的。这样做有些什么好处呢?

   让我们看一个更加复杂的例子:

public static void test4()
{
  int a = 12;
  int y = 32;
  TheEvent ev2 = delegate(ref int x)
  { Console.WriteLine("output x + y : {0}", x + y); Thread.Sleep(100); };
  //ev2(ref a);
  IAsyncResult ar = ev2.BeginInvoke(ref a,
  delegate(IAsyncResult ar2)
  {Console.Write("Operation finished: {0} on thread ID:{1}, is pool: {2}",ar2.IsCompleted,Thread.CurrentThread.GetHashCode(), Thread.CurrentThread.IsThreadPoolThread);}
, null);

  Console.WriteLine("do some other calculations while counter thread is working");
  Console.Write("work status : {0} Main Thread ID:{1}, is pool: {2}",
  ar.IsCompleted,
  Thread.CurrentThread.GetHashCode(),
  Thread.CurrentThread.IsThreadPoolThread);
  Thread.Sleep(500);

  ev2.EndInvoke(ref a, ar);
}

   这个例子中使用了系统线程池对于任务进行排队,适合于IO或者计算密集型的操作的时候。使用匿名委托最大的好处在于可以完整地克隆当前运行空间上下文的可用变量,虽然这可能从另一个层面上也增加了同步的复杂度,所谓有得必有失。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网