当前位置: 首页 > 编程语言 > C# > 正文

[C# 3.0 入门] [第一章 Lambda表达式] 第四节

时间:2010-06-13 博客园 五斗米

[C# 3.0 入门] [第一章 Lambda表达式] 第四节:Lambda的用途 & 类型声明能够和不能够省略的情况

成问题的是,虽然为了源代码的简洁性,很想用Lambda表达式,但是要写的代码却不能全部都用Lambda表达式来写。

那么, Lambda表达式究竟能做到什么程度呢?

习惯了C/C++编程风格的程序员,一定以为因C#语法与之很相似,所以用C#编写相对复杂的程序应该也没有问题。可是很遗憾,情况不是这样。那是因为C/C++具有能写出复杂功能的表达式的逗号表达式,而C#却没有。

例如,C/C++中,下面的代码是可行的。

int a,b,c;

c = (a=1, b=2, a+b); // a=1、b=2、c=a + b
printf("%d\n",c);

正因为仅仅一个表达式就能做相当多的处理,所有逗号表达式才有着重要的意义。

但是,C#却没有这样的用法。

但是C#有三元运算符?:和空接合运算符??。通过使用这些运算符,相当数量的代码都可以用Lambda表达式来写了。

例如,“根据参数指定的文件名向文件中写入字符串,参数为null的情况下,用‘default.txt’作为默认文件名”这样的Lambda表达式,像下面那样,用空接合运算符??就可以用Lambda表达式来写。

using System;

class Program
{
  static void Main(string[] args)
  {
    Action<string> method =
      (filename) => System.IO File.WriteAllText(
                          filename ?? "default.txt", "Hello!");

    method(null); // 生成default.txt
    method("hello.txt"); // 生成hello.txt
  }
}

List11 使用了空接合运算符??的Lambda表达式

或者“参数的flag如果是false的话,文件名就是‘normal.log’,true的话就是‘system.log’”的情况下,使用三元运算符(?:)按照如下的方式以表达式形式的Lambda来写。

using System;

class Program
{
  static void Main(string[] args)
  {
    Action<bool> method =
      (system) => System.IO.File.AppendAllText(
          system ? "system.log" : "normal.log", "log message\r\n");

    method(false); // 生成normal.log
    method(true); // 生成system.log
  }
}