一切皆有可能

SLEEPY BUT POWERFUL (A.K.A 速马) Creative Commons License
随笔 - 43, 评论 - 483, 引用 - 14

导航

关于

我

联系方式 (夏桅 xia4 wei2)

译作

 

三章样章阅读
[CSDN读书频道提供]

 

想做点好事的来看看

一字不识的藏族同胞阿牛创办的完全免费学校

 

MVP Profile

Visual Developer - .NET/C#

Visitors

Locations of visitors to this page

标签

每月存档

最新留言

广告

C# Anonymous Methods的前台和幕后 [Part.1]

写Javascript的时候,经常会感觉到这个语言有些地方真的很爽,比如你可以写var f = function(){}; 然后把f当作变量到处传,如同C的函数指针;也可以直接写xx.onclick = function(){}; 这就是传说中的匿名方法了

C#的设计者似乎也赞赏这种syntax sugar动态语言的特性垂涎不已,在其2.0版本也推出了匿名方法的概念。我在想Javascript的那些pattern在C# 2.0能用上多少,所以一个一个的试验了下。

[ROUND 1]

Javascript:
var f = function() {};

C# 2.0:
delegate void F(); // 这个没有办法,C#还得保持它的强类型语言的特性
F f = delegate() {}; // 这里的f也可以当作一个函数指针传递给其他变量或者方法

Javascript:
button1.onclick = function() {};

C# 2.0:
button1.Click += delegate(object sender, EventArgs e) {}; // 这里不完全一致,=意味着覆盖了当前的委托链,+=则是在链表上添加了一个新的委托

[ROUND 2]

Javascript:
var msg = "hello";
button1.onclick = function() {alert(msg); };

C# 2.0:
string msg = "hello"; // 注意msg可以是某个方法内的局部变量,而不一定是某个类的成员
button1.Click += delegate(object sender, EventArgs e) {MessageBox.Show(msg); };

[ROUND 3]

Javascript:
var msg = "hello";
button1.attachEvent("onclick", function() {alert(msg); }); // JScript syntax, IE only

C# 2.0:
string msg = "hello";
button1.Click += delegate(object sender, EventArgs e) {MessageBox.Show(msg); };

看上去C# 2.0的这个特性和Javascript的不相上下,并且两者的行为非常接近。可是连他们的syntax trap都保持一致:

[ROUND 4]

Javascript:
var msg = "hello";
button1.attachEvent("onclick", function() {alert(msg); });
msg = "!";
button1.attachEvent("onclick", function() {alert(msg); }); // 点击button1时弹出两次"!"

C# 2.0:
string msg = "hello";
button1.Click += delegate(object sender, EventArgs e) {MessageBox.Show(msg); };
msg = "!";
button1.Click += delegate(object sender, EventArgs e) {MessageBox.Show(msg); }; // 点击button1时也弹出两次"!"

肯定有人会认为应该都是先弹出"hello",再弹出"!",但事实不是这样。这里得特别注意。

测试环境:Windows XP SP2, IE6, VS 2005 RC1

---- updated?on 9/28/2005

修改了一些用词,确实有点misleading。

原来想在Part.2写一些编译器如何实现这种语法的背景信息,不过现在觉得没啥意思(对编程没什么帮助)。而Ninupter认为这个语法带来的动态特性的意义非常重大,我又不懂这个,所以接开心的tag游戏,把下一棒交给Ninputer?

Refer to: http://www.theserverside.net/tt/articles/showarticle.tss?id=AnonymousMethods

posted on 2005-09-28 01:16:00 by sunmast  评论(19) 阅读(7209)

入住博客堂, 大家好!

久仰博客堂和诸位堂主大名,早有加入之心愿。昨日TechEd会后和开心就好一起吃饭,不但骗到了一顿晚饭,还搞到了一个博客堂帐号  (玩笑~)

我于今年七月被评为MVP,Visual C#产品组。从D/HTML到ASP,从ASP.NET、Web Service到Windows Application,再到COM+/Enterprise Service,数年来一直对微软的产品和技术情有独钟,并且看来还将继续下去。

我的运气似乎一直很好,大学时一直有一个C/C++高手也是师兄带我;在学Web技术时,学校也提供了良好的环境;到后来初学.NET时,又在CSDN上遇到了思归、panyee等热心人指点。

后来觉得应该像思归等热心人帮助我那样帮助一下别人,遂开始到CSDN的.NET论坛灌贴。于是现在成了.NET版的大版主... MVP和这个也有关。

独学而无友,则孤陋而寡闻。虽然无法保证发表的所有post都是100%成熟的想法,但讨论可以把不成熟的想法变得成熟,并且所有人都受益。另外一方面,我脑子里时常有不少好的想法冒出来,写成文章不太合适(万一误导了别人岂不就要糟鄙视...),写blog应该是很好的方式。

我年龄相对较小,这里各位都是我的前辈,以后请多多指教

posted on 2005-09-20 21:07:00 by sunmast  评论(15) 阅读(2978)

Powered by: Joycode.MVC引擎 0.5.2.0