摘要:写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......[
阅读全文]