欢迎光临极品网,更多、更新的资源信息尽在Jpinw.Com!本站所有信息资源每日更新新的内容,请大家继续关注www.Jpinw.com!如果觉得本站还不错,对您有帮助,别忘了向您的朋友推荐本站!请记好本站网址:http://www.Jpinw.com,网站发展靠大家多多的支持!!!

极品网 极品课件 极品论文 极品文学 极品游戏 极品美容 极品手机资源 极品股票

#
免费资源: 免费域名 | 免费空间 | 免费推广 | 免费邮箱 | 免费硬盘 | 免费论坛 | 免费留言 | 免费统计 | 在线投稿 | 更多...
电脑学院: 操作系统 | 安全相关 | 网页设计 | 编程开发 | 建站经验 | 服务器类 | 黑客攻防 | 菜鸟入门 | 教你网赚 | 更多...
文章导航: 网赚学堂 | 网赚秘笈 | 网赚三维 | 网赚先锋 | 网赚资讯 | 感悟网赚 | 众生百态 | 经典美文 | 范文中心 | 更多...
图酷天下: 时事图酷 | 娱乐图酷 | 搞笑图酷 | 时尚图酷 | 体育图酷 | 另类经典 | 论文资源 | 课件下载 | 文学知识 | 更多...

您现在的位置: 极品网 >> 电脑学院 >> 编程开发 >> C#VBJAVA >> 教程正文

C#2.0 新特性探究(二) 委托与匿名委托            【字体:
C#2.0 新特性探究(二) 委托与匿名委托
作者:佚名    教程来源:不详    点击数:    更新时间:2008-6-4    

 








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或者计算密集型的操作的时候。使用匿名委托最大的好处在于可以完整地克隆当前运行空间上下文的可用变量,(虽然这可能从另一个层面上也增加了同步的复杂度,所谓有得必有失,hehe)。



[to be continued…]

 

教程录入:admin    责任编辑:admin 
  • 上一篇教程:

  • 下一篇教程:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关教程
    C#:Web Service异常处理
    C#:获得文件版本信息及只读文
    C#:文件的按行读/写及文件目
    C#2.0 Specification(泛型二
    C#2.0 Specification(泛型一
    C#2.0的特性
    C#2.0简介
    C#2.0语言规范(三)匿名方法
    C#2.0语言规范(四)迭代器
    C#2.0语言规范(五)不完全类
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    极品网
    | 设为首页 | 加入收藏 | 友情链接 | 版权声明 |
    极品网

    Copyright 2006 Jpinw.com 极品网

    备案号:浙ICP备07010375号

    极品网