VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • c#3.0入门第一章 Lambda表达式第三节Lambda表达式与匿名方法的区别

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  Lambda表达式与匿名方法的区别

  那么,为什么Lambda表达式比匿名方法写起来要短呢?这种像变戏法一样的手法真的能用吗?有没有重要信息遗漏掉呢?为了回答这些问题,就让我们把匿名方法和Lambda表达式比较一下,看看Lambda表达式究竟怎么写。

 1using System;
 2
 3delegate int SampleDelegate(int x, int y);
 4
 5class Program
 6{
 7  private static void Calculate(int x, int y, SampleDelegate calculator)
 8  {
 9    Console.WriteLine(calculator(x, y));
10  }
11
12  static void Main(string[] args)
13  {
14    // 匿名方法
15    Calculate(1, 2,
16      delegate(int x, int y) { return x + y; }); // 输出:3
17
18    // Lambda表达式
19    Calculate(1, 2, (x, y) => x + y); // 输出:3
20  }
21}
22

  List9 匿名方法与Lambda表达式的比较

  这段代码中,下述部分分别是匿名方法和Lambda表达式的写法:

  匿名方法

  delegate(int x, int y) { return x + y; }

  Lambda表达式

  (x, y) => x + y

  字面上比较一下就能发现以下不同:

  * delegate关键字没有了

  * return关键字没有了

  * 指定参数的类型的int没有了

  * 中括号“{ }”没有了

  * 行尾的分号“;”没有了

  * 新出现了“=>”这两个字符

  下面,对这些区别,一个一个来解释。

  首先,Lambda表达式使用的“=>”,叫“=>运算符”,读作“向~输入”(日本读法,跟国情有关)。在上例中,就读作“向x、y输入 x+y”(虽这样说,但如果不习惯也不必勉强这样读,笔者也不爱这样读,忒费劲)。delegate关键字并不是去掉了,如果理解为被“=>”运算符替换了的话可能更容易理解。这就是区分“匿名方法”与“Lambda表达式”的关键字。仅这一点,就从delegate的8个字母减到=>两个字母,少了6个字母呢!(这账算的,也不知是真傻还是精明过头了。对我们C#程序员来说,敲入delegate恐怕要比敲入=>快多了。鬼知道=、& gt;这两个字符在哪个键上,每次都要低头去找,还要按Shift,麻烦!)

编缉推荐阅读以下文章

  • [C# 3.0 入门] [第一章 Lambda表达式] 第五节:Lambda表达式的使用范例 & Lambda表达式的各种变体
  • [C# 3.0 入门] [第一章 Lambda表达式] 第四节:Lambda的用途 & 类型声明能够和不能够省略的情况
  • [C# 3.0 入门] [第一章 Lambda表达式] 第二节:Lambda表达式带来了什么
  • [C# 3.0 入门] [第一章 Lambda表达式] 第一节:C# 3.0 是什么 & C# 3.0的适用范围
  • C# 3.0 入门系列(一)
 

  其次,return这个关键字,因为Lambda表达式本身就是“表达式”,所有旧没有必要再return了(如果是代码段的话,就又需要return了,后面详述)。例如:

  int method() { return 1 + 2; }

  这种情况下return还需要。但这种情况:

  1 + 2

  就不需要再return了。这里去掉return,又减去6个字符。(大汗)

  参数类型不需要指定了,有些人可能会担心对于类型检查是不是太草率了,有人可能会窃喜不用再费事去声明类型了,切实这两种人都错了。List 9,Calculate方法的参数是SampleDelegate类型的,SampleDelegate代理的参数是2个int类型的,已经声明过了。所以不用再一次声明,x和y已经可以确定是int类型了。

  这里再补充一点,这些其实都不是Lambda表达式所特有的。匿名方法虽确实需要显式的把参数类型写上,返回值的类型却采用了同样方法来推断。反过来说,如果不能够进行这样的推断,那么匿名方法和Lambda表达式都不能使用。类型不确定的场合下,是不能够使用的。这一点要记住。

  接下来是中括号{ }和行尾的分号;的省略,其理由其实和return的理由是一样的,因为Lambda表达式本身就是表达式(相反,加上中括号{ }的就是“Lambda语句”,后文详述)。

  OK,讲完收功。没什么神奇的,也不损失严密性,但其实现的代码缩短能力却是压倒性的。

  Lambda语句(日本人叫Statement型Lambda)

  到目前为止见到的Lambda表达式,都是“表达式型的Lambda”。因为其都是按表达式的方法写的而得名。

  另外,还有一种内容按语句方式写的“Lambda语句”。它不是简单的表达式。如果要把较长代码写入Lambda的话还是Lambda语句好用。书写方式也简单,就是用中括号括起来就行了。

 

  以下是一个例子:

using System;

class Program
{
  static void Main(string[] args)
  {
    // Lambda语句
    Action<string> method = (filename) =>
      {
        if (filename == null)
          Console.WriteLine("Hello!");
        else
          System.IO.File.WriteAllText(filename, "Hello!");
      };

    method(null); // 输出:Hello!
    method("hello.txt"); // 生成hello.txt文件
  }
}

  Lambda语句有返回值得情况下就使用return。例如,下面的Lambda表达式换做Lambda语句的话:

  表达式形式的Lambda

  (n) => a == n;

  语句形势的Lambda

  (n) => { return a == n; };

  这个一看就明白了,文字上长了不少。但是,不能写Lambda表达式,只能用Lambda语句的情况下,仅一个return的增加这样的开销还是能够接受的。

 

编缉推荐阅读以下文章

  • [C# 3.0 入门] [第一章 Lambda表达式] 第五节:Lambda表达式的使用范例 & Lambda表达式的各种变体
  • [C# 3.0 入门] [第一章 Lambda表达式] 第四节:Lambda的用途 & 类型声明能够和不能够省略的情况
  • [C# 3.0 入门] [第一章 Lambda表达式] 第二节:Lambda表达式带来了什么
  • [C# 3.0 入门] [第一章 Lambda表达式] 第一节:C# 3.0 是什么 & C# 3.0的适用范围
  • C# 3.0 入门系列(一)
 

  其次,return这个关键字,因为Lambda表达式本身就是“表达式”,所有旧没有必要再return了(如果是代码段的话,就又需要return了,后面详述)。例如:

  int method() { return 1 + 2; }

  这种情况下return还需要。但这种情况:

  1 + 2

  就不需要再return了。这里去掉return,又减去6个字符。(大汗)

  参数类型不需要指定了,有些人可能会担心对于类型检查是不是太草率了,有人可能会窃喜不用再费事去声明类型了,切实这两种人都错了。List 9,Calculate方法的参数是SampleDelegate类型的,SampleDelegate代理的参数是2个int类型的,已经声明过了。所以不用再一次声明,x和y已经可以确定是int类型了。

  这里再补充一点,这些其实都不是Lambda表达式所特有的。匿名方法虽确实需要显式的把参数类型写上,返回值的类型却采用了同样方法来推断。反过来说,如果不能够进行这样的推断,那么匿名方法和Lambda表达式都不能使用。类型不确定的场合下,是不能够使用的。这一点要记住。

  接下来是中括号{ }和行尾的分号;的省略,其理由其实和return的理由是一样的,因为Lambda表达式本身就是表达式(相反,加上中括号{ }的就是“Lambda语句”,后文详述)。

  OK,讲完收功。没什么神奇的,也不损失严密性,但其实现的代码缩短能力却是压倒性的。

  Lambda语句(日本人叫Statement型Lambda)

  到目前为止见到的Lambda表达式,都是“表达式型的Lambda”。因为其都是按表达式的方法写的而得名。

  另外,还有一种内容按语句方式写的“Lambda语句”。它不是简单的表达式。如果要把较长代码写入Lambda的话还是Lambda语句好用。书写方式也简单,就是用中括号括起来就行了。

 

  以下是一个例子:

using System;

class Program
{
  static void Main(string[] args)
  {
    // Lambda语句
    Action<string> method = (filename) =>
      {
        if (filename == null)
          Console.WriteLine("Hello!");
        else
          System.IO.File.WriteAllText(filename, "Hello!");
      };

    method(null); // 输出:Hello!
    method("hello.txt"); // 生成hello.txt文件
  }
}

  Lambda语句有返回值得情况下就使用return。例如,下面的Lambda表达式换做Lambda语句的话:

  表达式形式的Lambda

  (n) => a == n;

  语句形势的Lambda

  (n) => { return a == n; };

  这个一看就明白了,文字上长了不少。但是,不能写Lambda表达式,只能用Lambda语句的情况下,仅一个return的增加这样的开销还是能够接受的。


相关教程