第二章C# and VB.NET语言增强
本章包括:
C# 3.0 和 VB.NET 9.0怎样使用LINQ
隐式类型化局部变量
对象初始值设定项
lambda 表达式
扩展方法
匿名类型
在第 1 章我们讨论使用 LINQ 的动机,并引入一些代码来让您了解如何工作。在本章我们将介绍该语言。
使用LINQ允许查询混合到编程语言的扩展。LINQ 是C# 和 VB.NET 语言的扩展并使用新结构。在学习之前很重要的是回到LINQ身上来,本章是解释LINQ如何让 C# 和 VB.NET 语言已变得如此丰富。请注意我们在使用linq是很成熟的。我们讲解LINQ重点时间不能太长,因此本章不能详细讲解每一部分功能。当您熟悉各种功能的时候,本章将使您了解本书是如何讲解问题的。在第 3 章我们将重点讲诸如表达式目录树和查询运算符的特定于 LINQ 的概念。然后在第三章您会用到LINQ相关功能。
2.1发现新的语言增强功能
NET 2.0 奠下了很多 LINQ 需要协同工作的基础。事实上,它引进多项重要的语言和 Framework 增强功能。例如.NET 现在支持泛型类型,以及需以达到深入数据集成的 LINQ 目标,可以参数化的类型 —
否则类型系统不够丰富。C# 2.0 还添加匿名方法和迭代器。这些功能作为新的数据和编程语言之间的集成级别的基石。
我们预期这本手册的读者了解基本.NET 2.0 提供的功能。我们将您提供 2.4 节中的匿名方法上的复修我们提出 lambda 表达式和我们将检讨第 3 章中的迭代器时。 LINQ 公开诸如 C# 和 VB.NET 语言的查询语法更多的功能。 C# 3.0 和 VB.NET 9.0 (也称为 VB 2008年) 生成泛型、 匿名方法和迭代器,作为 LINQ 设施的主要组件。这些功能包括,
1、隐式类型化的许可证的局部变量从表达式用于初始化它们推断出类型本地变量。
2、对象初始值的构造和对象的初始化。
3、lambda 表达式提供的作为发展匿名方法改进的类型推断和转换为委托类型和表达式目录树,我们将在下一章讨论。
4、扩展方法令可以扩展现有的类型和构造的类型与其他方法。 使用扩展方法类型不是扩展,但看起来像是扩展。
5、匿名类型,这是自动推断出,并从对象初始值设定项创建的类型。
而不用只列出这些新的语言功能和详列他们逐一,对发现他们而言,是一个持续的示例。这有助于我们清楚了解他们可以帮助我们在日常的编码。
我们将与最简单的代码可能使用唯一的.NET 2.0 构造启动,然后我们将的逐步引入新的语言功能改善。
每个重构的步骤将指向特定问题或语法功能。首先,让我们熟悉简单的示例: 应用程序输出运行进程的列表。
2.1.1运行进程通用列表
我们要获取的我们计算机上运行的进程的列表。在系统中是很轻松的。引用Diagnostics.Process.GetProcesses API。
注意 在示例中我们使用GetProcesses方法,因为它返回的结果,可能会因每次一个泛型列表被调用该方法而不同。这使得我们的示例比会基于一个静态列表的项目更切合实际。
表2.1简单的目标的示例 C# 2.0 代码。
表2.1示例.NET 2.0 代码列出进程
using System;
using System.Collections.Generic;
using System.Diagnostics;
static class LanguageFeatures
{
static void DisplayProcesses()
{
List<String> processes = new List<String>();//准备字符串的列表
foreach (Process process in Process.GetProcesses())
processes.Add(process.ProcessName);//生成的进程的列表
}
static void Main()
{
DisplayProcesses();//打印到屏幕每一行。
}
}
我们进程变量指向的字符串列表。我们使用该类型基于泛型类型List<T>。在.NET 2.0 中最重要的是添加了泛型的支持。它们允许我们最大化代码重用、 类型安全和性能。就像我们现在做的最常见使用泛型是创建强类型的集合的类。您将注意到 LINQ 广泛使用泛型。在该列表,我们使用一个名为ObjectDumper类来显示结果。ObjectDumper 是作为 LINQ 代码示例的一部分由 Microsoft 提供一个实用工具类。在整个这本书的很多代码示例中,我们将重复使用 ObjectDumper类。(这些示例的完整源代码是在 http://LinqInAction.net可供下载。)可用于 ObjectDumper 转储对象到控制台的内存中。尤其是用于调试目的;我们将使用它在这里显示我们处理结果。
这个版本的代码并没有更多的功能,只是将进程名称加入的到列表中。控制台程序将每个进程显示出来。然而,在未来的示例中,我们将有更复杂的结果以显示。ObjectDumper 将然后保存我们一些代码为我们做工作显示出来。
这是 2.1 制作某些示例输出
firefox
Skype
WINWORD
devenv
winamp
Reflector
这个示例是十分简单的。很快,我们将希望能够对此列表进行筛选、排序它,或执行其他操作如分组或预测。让我们修改这个示例。关于进程名称,我们会有更感兴趣的信息。
2.1.2在类中对结果进行分组(p77)