动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C#应用
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C#应用 ]的信息

本月文章推荐
.C# 存取数据库中的图像.
.C#中的类型相等与恒等(Equality .
.2进制、8进制、10进制、16进制...
.c# 正确读取存储中文,以及如何获.
.将PUBS中的所有用户表内容分别用.
.如何在控件的设计时得到窗体设计.
.教你如何快速捕获.NET代码中隐藏.
.在C#中加载自己编写的动态链接库.
.用C#把文件转换为XML.
.C#列出局域网中可用SQL Server服.
.C# Operate Excel File .
.用Visual C#来清空回收站(1).
.用Visual C#调用Windows API函数.
.用API得到局域网中可用SqlServer.
.C#消息队列应用程序 -2.
.基于Remoting透明代理的AOP组件.
.用Visual C#获得计算机名称和IP.
.Visual C#2005中使用正则表达式.
.C#-委托和事件.
.c-sharp开发应避免的几个小滥用.

对C# 2.0中匿名方法的怀疑分析

发表日期:2005-11-25 |


  一、 简介

  所有的方法都使用一个来自于相同集合的元素的子集。在C# 2.0中,可选元素集将会继续增长。从历史上看-除了C++内联方法之外-方法都要求有一个名字、一个返回类型和一个方法体。而且可选择地,方法可以使用存取修饰符和一个参数列表。在C# 2.0中,方法名已经从必需的变成了可选的。

  C# 2.0(一般就代表.NET)引入了匿名方法。一个匿名方法可以被用在任何使用代理且该代理被定义为内联的情况下,它不需要方法名,而具有可选的参数和一个方法体。

  为了使用匿名方法,你需要了解什么是代理。因此,在我们详细讨论何时使用匿名方法以及匿名方法的局限性之前,先让我们简要地回顾一下代理。

  二、 代理回顾

  匿名方法对于声明和使用代理来说是一种压缩方式(如果你对什么是代理还有疑问,请继续阅读;否则,可以跳过下面的这一部分)。代理,作为一种指向函数签名的指针,在.NET语言之前的语言中就已存在。切记,在计算机中一切其实都是位和字节。通过引入函数指针技术,有可能动态地把一些未来的目前尚未知的函数赋给指针,并由此诞生了事件。

  函数指针的基本使用方法是,可以把一个函数的地址赋给一个单一的指针。为了通过一个指针来调用该函数,程序员要对之进行检查以决定是否这个指针为null,然后间接地通过这个指针调用这个函数。总之,要使用指针,必须进行null检查,而现在"一个指针对应一个函数"作为一种限制也该到结束的时候了。

  回顾一下来分析,代理会成为原始函数指针的下一个进化替代者。一个代理即是一个类,它对该指针进行了封装;隐含地,.NET中的代理是multicast代理。作为一个multicast代理仅仅意味着不再存在"一个函数对应一个指针"的限制,因为multicast代理类包含一个指针列表。包含一个内部列表意味着多于一个函数的地址可以被赋值给一个单一的代理。当该代理-你可以认为是"事件"-被激发或调用时,所有的内部列表函数被调用。

  注意 在C#中,我们调用代理的方式就象从前我们调用方法以及调用所有的赋值函数一样;但是我们仍然能够进行null检查。在Visual Basic.NET中,null检查隐含在激活事件行为中。

  在C#中,函数地址通过使用一个重载的+=操作符插入到一个列表中并且经由一个重载的-=操作符而被删除。C#还支持手工地定义添加和删除块;添加和删除对于代理恰似get和set对于属性。

  在C# 1.0和C# 1.1中,典型情况下,我们把代理实例赋给事件属性。例如,在WinForms中,一个Button控件暴露一个Click事件。Click的代理类型是EventHandler。EventHandler是一个以对象和EventArgs为参数的方法。因此,我们可以用匹配代理EventHandler的签名的任何方法来初始化一个EventHandler对象并且把代理赋给Click。下面是该代码看上去的样子:

private void Form1_Load(object sender, EventArgs e)
{ button1.Click += new EventHandler(OnClick);}
private void OnClick(object sender, EventArgs e)
{ Debug.WriteLine("button1 clicked");}

  因为WinForms的表单设计器和WebForms的页面设计器自动地添加代理绑定;所以,我们有可能不需要手工式地绑定代理而建立大量的代码。

  三、 匿名方法是内联代理

  通常,当我们使用代理时,我们总是有一个方法。该方法的签名匹配代理的签名规定并且能被用来初始化一个代理实例。匿名方法用于把方法和代理的初始化压缩到一个单一的位置。

  通过使用前一节的例子,我们已看到代理new EventHandler的实例化是怎样区别于用来初始化该代理的方法OnClick的。这部分代码能被压缩成一个匿名方法:

private void Form1_Load(object sender, EventArgs e){
 button1.Click += delegate
 {
  Debug.WriteLine("button1 clicked");
 };
}

  为了创建该匿名方法,请注意我们删除了OnClick的方法头并且用OnClick的方法体的单词delegate代替了EventHandler代理的构造器。其所导致的结果行为是相同的。如果我们想使用事件参数,我们通常与代理相关联,我们可以在单词delegate之后添加一可选的参数列表:

private void Form1_Load(object sender, EventArgs e){
button1.Click += delegate(object s, EventArgs ev)
{ Debug.WriteLine("object is " + s.ToString()); };
}

  如果你定义代理参数,它们必须匹配代理类型所定义的参数。例如,Click的类型是EventHandler,因此如果参数存在,它们必须匹配EventHandler的参数对象和EventArgs。

  匿名方法可以被使用在任何需要使用代理的地方。匿名方法可以使用ref和out参数,但是不能使用全局范围的reference ref或out参数。匿名方法不能使用unsafe编码,并且匿名方法不能以使得分支行为跳出匿名方法的代码块的方式来使用goto,break或continue等语句。

  四、 市场调查结果

  匿名方法是好东西吗?市场调查证明匿名方法确实不错,因为它们能够减少由于实例化代理和减少分离方法所导致的代码开销。而且市场调查还证明匿名方法增强了可用性和可维护性。我认为良好命名的方法也可以实现这一点。请看下面的代码容易维护吗?

private void Form1_Load(object sender, EventArgs e)
{
 BindClick(delegate { Debug.WriteLine("button1 click"); });
}
private void BindClick(EventHandler handler)
{
 button1.Click += handler;
}

  在这个例子中,我们把一个代理传递给一个方法-通过把该代理作为一个匿名方法传递。仅是保持圆括号、分号和方括号的顺序和个数就已令人十分头疼。

  如果引用经典示例来说明,那就是匿名方法仅仅是因剔除了线程(它们使用代理)而减少了相应的创建代理和方法的开销。这倒是真的,但是线程并不经常使用并且想正确使用也非常困难。我在想,要想使代码更为秘密些而不是更为公开些该是多么谨慎的一件事情。

  就语言方面来讲,我喜欢方法;但是作为一个实际开发中的事物,匿名方法也许仅是微软的某个发明者有点太聪明的一种证明。

  五、 总结

  匿名方法是可以存在没有名字的方法的证明-它们可以被定义并使用在任何能够使用代理的地方。代理是事件处理器的包装器。匿名方法到底有多大的实用性和普遍使用价值还有待于进一步的实践证明。我怀疑,匿名方法将不会比运算符重载有更大的用途,并且其使用也会少之又少;但是匿名方法现在已是.NET的一部分,所以在阅读代码时能够识别出它们来还是很有必要的。

作者: 朱先忠编译

上一篇:在C#中利用DirectX实现声音播放 人气:9264
下一篇:用C#实现FTP搜索引擎 人气:10040
浏览全部C#的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 HDWiki v4.0.1 bulid 081007 UTF
2008-10-7 迅易评选投票管理系统 v10.0
2008-10-7 HDWiki v4.0.1 bulid 081007 GBK
2008-10-7 Bitrac单用户博客 v1.14 bulid 0
2008-10-7 OpenX(广告管理系统) v2.6.2 多国
2008-10-7 乐铺网店系统免费普及版 v3.41
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成