卷首语:匿名委托实指匿名方法或Lambda表达式。
昨晚有一个朋友给我出了一个问题:
在如下代码中,怎样才能输出“Hello World”
1 if(---填入代码---) 2{ 3 Console.Write("Hello "); 4 } 5 else 6 { 7 Console.Write("World"); 8 }
当然,他说也可以用Java做,但是只能用一句话搞定。
因为本人比较喜欢.NET这边,所以首选C#试了一下。
首先,我们很本能地想到,if-else语句块中只能执行到一个(除了在特定情况下使用线程或者使用“true)else if(^!)^!”来截断判断等等非常规方法)。所以,我们理所当然地想到:必须在执行if条件时将Hello输出。于是,我想到了匿名方法(注:参考http://baike.baidu.com/view/2308725.htm(匿名方法 百度百科)http://baike.baidu.com/view/2761370.htm(匿名委托 百度百科)http://msdn.microsoft.com/zh-cn/library/0yw3tz5k.aspx(匿名方法(C#编程指南)))。
于是,我编写了如下代码:
1 using System; 2 3 namespace HelloWorldOutPutTest1 4 { 5 // 定义委托 6 public delegate bool MyDelForTest1(); 7 8 public class Test1 9 { 10 private MyDelForTest1 _test1; // 声明委托变量 11 12 public static void Main(string[] args) 13 { 14 // 也可以使用如下写法 15 // if (new Test1() { _test1 = delegate() { Console.Write("Hello "); return false; } }._test1()) 16 if (new Test1() { _test1 = new MyDelForTest1(delegate() { Console.Write("Hello "); return false; } ) }._test1()) 17 { 18 Console.Write("Hello "); 19 } 20 else 21 { 22 Console.Write("World"); 23 } 24 } 25 } 26 }
熟悉委托的朋友肯定对这种写法不陌生,这种写法是正确的,运用了匿名方法来实现,但是还是没哟一句话解决啊!?
后来那位朋友告诉我他的写法:
1 using System; 2 3 namespace HelloWorldOutPutTest2 4 { 5 public class Test2 6 { 7 public static void Main(string[] args) 8 { 9 if (new Func<bool>(() => { Console.Write("Hello "); return false; }).Invoke()) 10 { 11 Console.Write("Hello "); 12 } 13 else 14 { 15 Console.Write("World"); 16 } 17 } 18 } 19 }
这下终于搞定了。使用了华丽的代码(注:参考http://technet.microsoft.com/zh-cn/magazine/bb534960(VS.90).aspx(Func<(Of <(TResult>)>) 委托)http://technet.microsoft.com/zh-cn/magazine/bb397687(VS.90).aspx(Lambda 表达式(C# 编程指南)))。
C#这边OK了,Java如何呢?
老师给了我们解决方案:
1 package HelloWorldOutPutTest3; 2 3 public class Test3 { 4 5 public static void main(String[] args) { 6 if(new Test3(){ public boolean test() { System.out.print("Hello ");return false;} }.test()) { 7 System.out.print("Hello "); 8 } 9 else { 10 System.out.println("world"); 11 } 12 } 13 }
看来C#和Java语法差别还是挺大的……
|
请发表评论