• C#匿名委托和匿名方法使用小技巧


      卷首语:匿名委托实指匿名方法或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语法差别还是挺大的……

  • 相关阅读:
    设计模式-代理模式
    设计模式-桥接模式
    设计模式-组合模式
    设计模式-享元模式
    设计模式-适配器模式
    设计模式-装饰器模式
    设计模式-外观模式
    redis日志格式
    Linux下的文件切割和文件合并
    Windows server 服务器的端口突然远程连不上了,但是可以远程连接,怎么回事?
  • 原文地址:https://www.cnblogs.com/Johness/p/2415653.html
Copyright © 2020-2023  润新知