上一篇 | 下一篇

C# 3.0新特性体验之Lambda表达式

发布: 2008-6-30 09:25 | 作者: admin | 来源: | 查看: 0次

  C#2.0介绍了一个新特性--匿名方法,允许开发者在线(inline)声明自己的函数代码而无须使用委托函数(delegate function)。C#3.0中提供了一个新特性--Lambda表达式,它提供了完成相同目标的更加简洁的格式。让我们在讨论Lambda表达式以前仔细研究一下匿名方法。

  匿名方法

  假设你需要创建一个按钮,当点击它的时候更新ListBox里的内容。在C#1.0和1.1里,你要这样做:

public MyForm()

{

 listBox = new ListBox(...);

 textBox = new TextBox(...);

 addButton = new Button(...);

 addButton.Click += new EventHandler(AddClick);

}

void AddClick(object sender, EventArgs e)

{

 listBox.Items.Add(textBox.Text);

}

  在C#2.0里,你需要这样做:

public MyForm()

{

 listBox = new ListBox(...);

 textBox = new TextBox(...);

 addButton = new Button(...);

 addButton.Click += delegate

 {

  listBox.Items.Add(textBox.Text);

};

  就像你看到的一样,你不必要特别的声明一个新方法来将它连接到一个事件上。你可以在C#2.0里使用匿名方法来完成同样的工作。C#3.0里介绍了一种更加简单的格式,Lambda表达式,你可以直接使用"=>"来书写你的表达式列表,后面跟上一个表达式或者语句块。

  Lambda表达式中的参数

  Lambda表达式中的参数可以是显式或者隐式类型的。在一个显式类型参数列表里,每个表达式的类型是显式指定的。在一个隐式类型参数列表里,类型是通过上下文推断出来的:

(int x) => x + 1 // 显式类型参数

(y,z) => return y * z; // 隐式类型参数

  Lambda演算实例

  下面的例子给出了两种不同的方法来打印出一个list中长度为偶数的字符串。第一种方法AnonMethod使用了匿名方法,第二种LambdaExample则是通过Lambda演算实现:

// Program.cs

using System;

using System.Collections.Generic;

using System.Text;

using System.Query;

using System.Xml.XLinq;

using System.Data.DLinq;

namespace LambdaExample

{

 public delegate bool KeyValueFilter(K key, V value);

 static class Program

 {

  static void Main(string[] args)

  {

   List list = new List();

   list.Add("AA");

   list.Add("ABC");

   list.Add("DEFG");

   list.Add("XYZ");

   Console.WriteLine("Through Anonymous method");

   AnonMethod(list);

   Console.WriteLine("Through Lambda expression");

   LambdaExample(list);

   Dictionary varClothes= new Dictionary();

   varClothes.Add("Jeans", 20);

   varClothes.Add("Shirts", 15);

   varClothes.Add("Pajamas", 9);

   varClothes.Add("Shoes", 9);

   var ClothesListShortage = varClothes.FilterBy((string name,

   int count) => name == "Shoes" && count < 10);

   // example of multiple parameters

   if(ClothesListShortage.Count > 0)

    Console.WriteLine("We are short of shoes");

   Console.ReadLine();

 }

 static void AnonMethod(List list)

 {

  List evenNumbers = list.FindAll(delegate(string i)

  { return (i.Length % 2) == 0; });

  foreach (string evenNumber in evenNumbers)

  {

   Console.WriteLine(evenNumber);

  }

 }

 static void LambdaExample(List list)

 {

  var evenNumbers = list.FindAll(i =>(i.Length % 2) == 0); // example of single parameter

  foreach(string i in evenNumbers)

  {

   Console.WriteLine(i);

  }

 }

}

public static class Extensions

{

 public static Dictionary FilterBy

(this Dictionary items, KeyValueFilter filter)

 {

  var result = new Dictionary();

  foreach(KeyValuePair element in items)

  {

   if (filter(element.Key, element.Value))

    result.Add(element.Key, element.Value);

  }

  return result;

 }

 

}

}

  如果你安装了Visual Studio 2005 and LinQ Preview,你可以使用编辑器来编译程序。如果没有的话,可以使用命令行方式:

C:\Program Files\LINQ Preview\Bin\Csc.exe

/reference:"C:\Program Files\LINQ Preview\Bin\System.Data.DLinq.dll"

/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll

/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll

/reference:"C:\Program Files\LINQ Preview\Bin\System.Query.dll"

/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll

/reference:"C:\Program Files\LINQ Preview\Bin\System.Xml.XLinq.dll"

/target:exe Program.cs

  中间语言结果显示

  打开ILDASM我们来查看一下程序,你将看到如图1所示的内容:

图1

  双击AnonMethod函数你将看到C#编译器产生的中间语言代码:

.method private hidebysig static void AnonMethod(class

[mscorlib]System.Collections.Generic.List`1 list)

cil managed

{

 // Code size 96 (0x60)

 .maxstack 4

 .locals init ([0] class [mscorlib]System.Collections.Generic.List

 `1 evenNumbers,

  string evenNumber,

  valuetype [mscorlib]System.Collections.Generic.List

 `1/Enumerator CSCODE_REPLACEMENT 000,

  bool CSCODE_REPLACEMENT 001)

 IL_0000: nop

 IL_0001: ldarg.0

 IL_0002: ldsfld class [mscorlib]System.Predicate

 `1 LambdaExample.Program::

 `<>9__CachedAnonymousMethodDelegate1

字号: | 推荐给好友

21/212>

评分:0

我来说两句