C# delegate的又一个例子(关于javascript 描写很生动)

写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

posted on 2005-10-18 17:09  小鸟飞飞  阅读(616)  评论(0)    收藏  举报

导航